[英]Autocad & System.Addin, FileNotFoundException for Autocads basic dlls
我剛剛開始開發AutoCAD 2016的應用程序。我想將dLL加載到單獨的AppDomain中,這樣我就不必一直重新啟動ACAD。
經過大量研究和嘗試,最終我得到了使用System.Addin和System.Addin.Contract的管道解決方案。
我在這個例子只能使用瀏覽合同接口和standardclasses和適配器喜歡這里 。
這是我的插件,其中包含一種將Hello寫入Acad編輯器的方法和另一種用於繪制線條的方法。
using System.AddIn;
using CADAddinView;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
namespace CADAddIn
{
[AddIn("cadAddIn", Version = "1.0.0.0")]
public class CADAddIn : ICADAddinView
{
public void drawLine()
{
Document acDoc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (DocumentLock acLckDoc = acDoc.LockDocument())
{
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
DBObject blkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead);
BlockTable acBlkTbl = blkTbl as BlockTable;
BlockTableRecord acBlkTblRec = (BlockTableRecord)acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Polyline acPoly = new Polyline();
acPoly.SetDatabaseDefaults();
acPoly.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
acPoly.AddVertexAt(0, new Point2d(100, 100), 0, 0, 0);
acBlkTblRec.AppendEntity(acPoly);
acTrans.AddNewlyCreatedDBObject(acPoly, true);
acTrans.Commit();
}
}
}
public void sayHello()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("Hello");
}
}
}
這是我的HostApplication:
using System.AddIn.Hosting;
using System.Windows.Forms;
using CADHostView;
using System;
using System.Collections.ObjectModel;
using Autodesk.AutoCAD.Runtime;
namespace CADHost
{
public class CADHost
{
[CommandMethod("sayHello")]
public static void sayHello()
{
string addInPath = Environment.CurrentDirectory + "\\Pipeline";
string[] warnings = AddInStore.Update(addInPath);
foreach (string warning in warnings)
{
MessageBox.Show(warning);
}
Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICADHostView), addInPath);
if (tokens.Count == 0)
{
MessageBox.Show("No AddIn found.");
}
else
{
AddInToken cadToken = tokens[0];
ICADHostView cadApp = cadToken.Activate<ICADHostView>(AddInSecurityLevel.Host);
cadApp.sayHello();
}
}
[CommandMethod("drawLine")]
public static void drawLine()
{
string addInPath = Environment.CurrentDirectory + "\\Pipeline";
string[] warnings = AddInStore.Update(addInPath);
foreach (string warning in warnings)
{
MessageBox.Show(warning);
}
Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICADHostView), addInPath);
if (tokens.Count == 0)
{
MessageBox.Show("No AddIn found.");
}
else
{
AddInToken cadToken = tokens[0];
ICADHostView cadApp = cadToken.Activate<ICADHostView>(AddInSecurityLevel.Host);
cadApp.drawLine();
}
}
}
}
這兩個應用程序都引用了Acad的三個標准Dll:accoremgd.dll,acdbmgd.dll,acmgd.dll。
在這兩個項目中,這些dll都具有本地副本為false的選項。 如果我啟動,則出現異常,程序無法在其中找到文件“ accoremgd.dll”,並且Acad崩潰。
因此,我嘗試僅將Addin的Option本地副本設置為true。 現在,它適用於“ sayHello” -Methode。
但是初始化acBlkTbl時,我收到一個invalide cast異常。
如果有人為我完成這項工作的最后步驟,那就太好了。 也絕不能用Addinsystem來創建一個有效的示例,我只想使此工作不一直重啟acad ^^
謝謝您對matthias的幫助
我不相信單獨的AppDomain會起作用,當您調用AutoCAD對象類型時,它將轉到主AppDomain並弄亂了...
因為只想編輯代碼而不重啟,所以您會更好地使用“ 編輯並繼續”功能 (我相信自AutoCAD 2015 VC2013起可用)。
不支持。 AutoCAD是一個非常老而復雜的程序,大多數AutoCAD API對象不能以遠程方式使用。
請閱讀:
在#3中,您可以看到AutoCAD開發團隊確認存在一些全局變量,這些變量將阻止這種方式工作。
我放棄了解決這個問題的嘗試。 我當前的“最佳”解決方案是在AutoCAD啟動時加載dll。 至少我不必netload每個dll。 如果有人有更好的解決方案,請隨時告訴我^^感謝所有回答。 馬蒂亞斯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.