2013-04-19 6 views
2

Поэтому у меня есть три части:загрузка других .NET библиотеки из C++/CLI библиотеки называется нативным кодом

  • Lib: A C# библиотеки, скомпилированные для AnyCPU.
  • BridgeLib: библиотека C++/CLI, скомпилированная для x86. Он экспортирует собственную функцию C, называемую bridgeEntry, и вызывает методы в Lib.
  • NativeExe: родное приложение C++ Win32, которое просто загружает BridgeLib.dll и выполняет bridgeEntry.

Теперь я помещаю их все в одну директорию, и, как и ожидалось, код из Lib выполняется при запуске NativeExe.

Однако, если изменить структуру каталогов, как это:

├───exe 
│  NativeExe.exe 
│ 
└───libs 
     BridgeLib.dll 
     Lib.dll 

вещи немного по-другому. Очевидно, что работает NativeExe.exe в папке exe, потому что он не может найти BridgeLib.dll. Но это можно решить, перейдя в папку libs и запустив ..\exe\NativeExe.exe. Теперь приложение загружает BridgeLib.dll и переходит на bridgeEntry. Но теперь CLR падает с FileNotFoundException, потому что он ищет Lib.dll в папке исполняемого файла (exe), а не в папке библиотеки моста libs.

Это просто слишком упрощенный пример, и я не могу изменить структуру каталогов. Но как еще я могу решить эту проблему?

ответ

2

Ваша библиотека C++/CLI может обрабатывать AppDomain.AssemblyResolve, чтобы правильно указать местоположение сборки C#. Это событие запускается CLR, когда ему не удается найти сборку во время выполнения, и дает вам возможность самостоятельно загрузить сборку.

+0

Это просто слишком упрощенный пример, на самом деле я ничего не знаю о структуре каталогов, кроме того факта, что собственные исполняемые файлы и сборки .NET находятся в разных каталогах. Как определить каталог в событии AssemblyResolve? –

+0

@ main-- Вам нужно знать, где собирается сборка .NET - * something *, чтобы обеспечить это местоположение, и если это не соответствует нормальным путям, вам нужно что-то делать. –

 Смежные вопросы

  • Нет связанных вопросов^_^