簡體   English   中英

Autocad&System.Addin,Autocads基本dll的FileNotFoundException

[英]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對象不能以遠程方式使用。

請閱讀:

  1. http://through-the-interface.typepad.com/through_the_interface/2008/09/tired-of-not-be.html
  2. http://forums.autodesk.com/t5/net/netload-is-there-a-net-unload-command/td-p/2404002
  3. https://www.theswamp.org/index.php?topic=38675.0

在#3中,您可以看到AutoCAD開發團隊確認存在一些全局變量,這些變量將阻止這種方式工作。

我放棄了解決這個問題的嘗試。 我當前的“最佳”解決方案是在AutoCAD啟動時加載dll。 至少我不必netload每個dll。 如果有人有更好的解決方案,請隨時告訴我^^感謝所有回答。 馬蒂亞斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM