Загрузить сборку из той же папки с родной DLL - PullRequest
1 голос
/ 24 ноября 2011

У меня есть этот (собственный) COM-сервер, назовем его N.dll , который вызывает некоторый API из управляемой сборки, назовем его M.dll . Чтобы это работало, существует DLL-библиотека смешанного режима для взаимодействия между ними; давайте назовем это MM.dll . Три библиотеки DLL (N, M и MM) находятся в одной библиотеке DLL, и сервер COM, очевидно, соответствующим образом зарегистрирован.

Я использую сборку M.dll с директивой using в MM.dll.

#using "M.dll"
using namespace M;

А затем просто создайте экземпляр и используйте типы, доступные в M.

Теперь этот COM-сервер может быть создан любым приложением, находящимся в любом месте системы. Это, очевидно, работает хорошо. Но как только N нужно вызвать API из M (через MM), я получаю System.IO.FileNotFoundException (необработанное исключение: System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'M, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null 'или одна из его зависимостей. Система не может найти указанный файл.)

Если я скопирую сборку M.dll в ту же папку, где находится исполняемый файл, то все работает нормально. Однако это не решение, поскольку может быть много приложений, использующих COM-сервер, и я не могу развернуть M.dll во всех этих местах. И я также не могу сделать что-то с файлом конфигурации для процесса, по той же причине. Мне нужен способ указать модулю MM.dll смешанного режима загрузить загружаемую сборку из той же папки, где она находится.

Это возможно?

1 Ответ

0 голосов
/ 24 ноября 2011

См. Обсуждение того, как Windows обнаруживает библиотеки DLL в msdn (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx).При загрузке COM-сервера зависимая DLL-библиотека должна находиться в Windows.Убедитесь, что алгоритм поиска найдет зависимые библиотеки DLL.

...