Исключение при динамической загрузке AutoCAD dll

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

Не удалось загрузить файл или сборку accoremgd.dll или одну из ее зависимостей. Указанный модуль не может быть найден.

Трассировки стека:

в System.Reflection.RuntimeAssembly._nLoad (AssemblyName имя_файла, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & ​​stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntanrospection Assembly , RuntimeAssembly reqAssembly, StackCrawlMark & ​​stackMark, IntPtr pPrivHostBinder, булева throwOnFileNotFound, булева forIntrospection, булевы suppressSecurityChecks) при System.Reflection.RuntimeAssembly.InternalLoadFrom (String assemblyFile, Evidence securityEvidence, Byte [], значение хэш AssemblyHashAlgorithm HashAlgorithm, булевой forIntrospection, булевы suppressSecurityChecks, StackCrawlMark & ​​stackMark ) в System.Reflection.Assembly.LoadFrom (String assemblyFile) в DynamicDLLAdd.Form1.btnLoad_Click (отправитель объекта, EventArgs e) в e: \ AutoCadOperations \ Test.AutoCadLoad_Re \ DynamicDLLAdd \ Form1. cs: строка 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);
}

Я думаю, проблема может быть в зависимостях dll. То, что должно быть сделано? Есть ли в наличии какие-либо документы или статьи?

Обновление: Целевая платформа программы - 4.0, а целевая платформа - Любой ЦП.

Я запустил fuselogvw.exe и думаю, это может быть ключом к разгадке моей проблемы. Понятия не имею, что здесь происходит, поэтому добавил картинку. Было бы большим подспорьем, если бы прояснил это. введите описание изображения здесь


person Skaranjit    schedule 21.07.2016    source источник
comment
Используйте Fusion Log Viewer (fuslogvw.exe), чтобы включить ведение журнала ошибок привязки (или это, если необходимо).   -  person Christian.K    schedule 21.07.2016


Ответы (2)


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

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

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

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

Дополнительную информацию о разработке подключаемых модулей AutoCAD можно найти в Центре разработчиков.

person Augusto Goncalves    schedule 21.07.2016

Думаю, проблема в том, что не загружена dll зависимостей.

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

1) Изменить целевую платформу (AnyCPU, 86,64)

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

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

3) Изменить структуру .net

person user2960398    schedule 21.07.2016
comment
Что ж, я выполнил шаги 2 и 3, и проблема, похоже, не устранена. через, когда я меняю целевую платформу на x86, произошла ошибка неправильного формата - person Skaranjit; 21.07.2016