2016-07-21 1 views
0

Я работаю над проектом, где мне нужно выяснить, какая версия AutoCAD установлена ​​на целевом компьютере. Мы рассмотрели возможность наличия множественной версии AutoCAD и, таким образом, согласно выбору пользователя, мы должны динамически загружать требуемые DLL из этой версии AutoCAD. Сначала программа обнаруживает доступные версии AutoCAD и показывает ее пользователю. Затем, после выбора конкретной версии, программа копирует DLL, например (accoremgd.dll, acdbmgd.dll, acmgd.dll) в каталог программы. Но когда я пытаюсь загрузить те DLL динамически, он показывает следующие ошибки:Исключение при загрузке динамической базы данных AutoCAD

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

Моя подпрограмма, которая динамически загружает файл является:

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 думаю, проблема может быть связана с зависимостями dll. То, что должно быть сделано? Существуют ли какие-либо документы или статьи?

Обновление: Целевая структура программы 4.0, а целью платформы является любой процессор.

Я запустил fuselogvw.exe, и я думаю, что здесь может быть ключ к моей проблеме. Я понятия не имею, что здесь происходит, я добавил фотографию. Это будет очень полезно, если это прояснит. enter image description here

+0

Используйте «Fusion Log Viewer» (fuslogvw.exe), чтобы включить ведение журнала ошибок привязки (или [this] (http://stackoverflow.com/a/16049933/21567), если необходимо). –

ответ

0

Я думаю, его проблема связана с зависимостями dll не загружается.

Проверить следующие возможности

1) изменение целевой платформы (AnyCPU, 86,64)

2) скопирована DLLs (accoremgd.dll, acdbmgd.dll, acmgd.dll) поместить в следующий каталог

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

3) Изменение .NET Framework

+0

Ну, я сделал шаги 2 и 3, и проблема, похоже, сохраняется. хотя, когда я меняю целевую платформу на x86, возникла некорректная ошибка fomat – Skaranjit

1

Вы не должны вручную загрузить AcMgd, AcCoreMgd ни AcDbMgd на у наша библиотека DLL, эти ссылки загружаются по AutoCAD-процессу (acad.exe) по умолчанию (только из папки acad.exe) и когда вы СЕТЬ вашу библиотеку DLL (т. ваш плагин), он будет автоматически связываться. При компиляции библиотеки DLL задайте Copy Local = FALSE в ссылках на AutoCAD. Если вы оставите TRUE, AutoCAD будет вести себя непредсказуемо.

Кроме того, не следует использовать ссылки AutoCAD для внешних приложений (т. Е. Проект .EXE в Visual Studio). На самом деле ссылки являются тонким слоем для доступа к реальной реализации в C++ (скомпилированы как динамические библиотеки .ARX) и будут работать только с acad.exe. Если вам нужно вызвать AutoCAD из внешнего приложения, вы можете использовать COM Automation или AutoCAD Console. See this reply.

При этом, начиная с AutoCAD 2012, вы можете использовать Autoloader mechanism. В итоге вы можете определить файл PackageContents.xml, который определит, какую библиотеку DLL загружать в соответствии с версией AutoCAD, которую имеет ваш клиент. Это самый простой способ NETLOAD вашего плагина в AUtoCAD.

Если вам по-прежнему необходимо зарегистрировать свой плагин (библиотеку DLL) вручную, вы можете создать registry key for it, но это немного сложно из-за многих версий вертикалей Версии AutoCAD (например, Civil 3D, Plant 3D, Map 3D и т. Д.). В разделе реестра есть определенная логика, check more here.

Узнайте больше о разработке плагинов AutoCAD на Developer Center.