2016-07-21 17 views
0

Ich arbeite an einem Projekt, wo ich herausfinden muss, welche Version von AutoCAD auf dem Zielcomputer installiert ist. Wir haben die Möglichkeit der Anwesenheit mehrerer AutoCAD-Versionen in Erwägung gezogen und müssen daher, je nach Benutzerauswahl, die benötigten DLLs dynamisch aus dieser Version von AutoCAD laden. Zunächst erkennt das Programm die verfügbaren Versionen von AutoCAD und zeigt es dem Benutzer an. Dann, nach der Auswahl einer bestimmten Version, kopiert das Programm DLLs wie (accoremgd.dll, acdbmgd.dll, acmgd.dll) in das Programmverzeichnis. Aber wenn ich versuche, diejenigen dll dynamisch zu laden, zeigt es Fehler folgende:Ausnahme beim Laden von AutoCAD dll dynamisch

Could not load file or assembly 'accoremgd.dll' or one of its dependencies. The specified module could not be found.

Stacktrace:

at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark) at System.Reflection.Assembly.LoadFrom(String assemblyFile) at DynamicDLLAdd.Form1.btnLoad_Click(Object sender, EventArgs e) in e:\AutoCadOperations\Test.AutoCadLoad_Re\DynamicDLLAdd\Form1.cs:line 140

Meine Unterroutine, die dynamisch die Datei lädt ist:

try 
{ 
    string destFile = @Path.Combine(Environment.CurrentDirectory,"accoremgd.dll"); 
    if (!File.Exists(destFile)) 
     return; 

    Assembly a = null; 
    a = Assembly.LoadFrom(destFile); 

    AppDomain.CurrentDomain.Load(a.GetName()); 
    MessageBox.Show("LOADED"); 
    Type classType = a.GetType("Autodesk.AutoCAD.ApplicationService.Document"); 
    object obj = Activator.CreateInstance(classType); 
    MethodInfo mi = classType.GetMethod("Create"); 
    //rest of the code here 
} 
catch (Exception exp) 
{ 
    MessageBox.Show(exp.Message); 
    MessageBox.Show(exp.Source); 
    MessageBox.Show(exp.StackTrace); 
} 

I denke, das Problem könnte mit den Abhängigkeiten der DLL. Was soll getan werden? Gibt es Dokumente oder Artikel?

Aktualisierung: Das Zielframework des Programms ist 4.0 und Platform target ist Any CPU.

Ich lief fuselogvw.exe und ich denke, hier könnte ein Hinweis auf mein Problem sein. Ich habe keine Ahnung, was hier vorgeht, also habe ich ein Bild hinzugefügt. Es wäre eine große Hilfe, wenn es klargestellt wird. enter image description here

+0

Verwenden Sie den "Fusion Log Viewer" (fuslogvw.exe), um die Protokollierung von Bindungsfehlern zu aktivieren (oder [dies] (http://stackoverflow.com/a/16049933/21567), wenn Sie müssen). –

Antwort

0

Ich denke, sein Problem ist Abhängigkeiten Dll nicht geladen.

prüfen folgende Möglichkeit

1) Veränderung Plattform Ziel (AnyCPU, 86,64)

2) kopiert dlls (accoremgd.dll, acdbmgd.dll, acmgd.dll) setzen auf folgende Verzeichnis

-> C:\Windows\System32 
-> C:\Windows\SysWOW64 

3) ändern .net Framework

+0

Nun, ich habe Schritt 2 und 3 gemacht und das Problem scheint zu bestehen. Wenn ich jedoch die Zielplattform auf x86 ändere, wurde ein falscher fomat-Fehler festgestellt – Skaranjit

1

Sie nicht manuell AcMgd, AcCoreMgd noch AcDbMgd auf y laden sollte unserer DLL-Bibliothek werden diese Referenzen standardmäßig in den AutoCAD-Prozess (acad.exe) geladen (nur aus dem Ordner acad.exe) und wenn Sie Ihre DLL-Bibliothek (z. B. Ihr Plugin), wird es automatisch verlinken. Stellen Sie beim Kompilieren Ihrer DLL-Bibliothek Local Copy = FALSE in AutoCAD-Referenzen ein. Wenn Sie den Wert TRUE beibehalten, verhält sich AutoCAD unerwartet.

Auch sollten Sie keine AutoCAD-Referenzen auf externe Anwendungen (d. H. Ein .EXE-Projekt in Visual Studio) verwenden. Die Referenzen sind tatsächlich eine dünne Schicht, um auf die reale Implementierung in C++ zuzugreifen (kompiliert als .ARX dynamische Bibliotheken) und funktionieren nur im Prozess mit acad.exe. Wenn Sie AutoCAD von einer externen Anwendung aus aufrufen müssen, können Sie COM Automation oder AutoCAD Console verwenden. See this reply.

Das heißt, ab AutoCAD 2012 können Sie Autoloader mechanism verwenden. Zusammenfassend können Sie eine PackageContents.xml-Datei definieren, die definiert, welche DLL-Bibliothek gemäß der AutoCAD-Version Ihres Kunden geladen werden soll. Das ist der einfachste Weg, Ihr Plugin in AUtoCAD zu laden.

Wenn Sie Ihr Plugin (DLL-Bibliothek) immer noch manuell registrieren müssen, können Sie eine registry key for it erstellen, aber es ist ein bisschen schwierig wegen vieler AutoCAD-Versionen von Verticals (z. B. Civil 3D, Plant 3D, Map 3D, etc.). Es gibt eine gewisse Logik bei den Registrierungsschlüsseln check more here.

Weitere Informationen zur AutoCAD-Plugin-Entwicklung finden Sie unter Developer Center.

Verwandte Themen