Как Visual Studio загружает библиотеки?

У меня есть решение с C #, C ++ & C ++ / CLI проекты. Чтобы быть более конкретным: это ядро ​​C ++ (~ 5 неуправляемых dll), оболочка ядра C ++ / CLI и сборки C # с логикой специфического проекта.

Некоторое время назад я понял, что конструктор форм VS 2008 (WinForms) иногда не может загрузить сборку оболочки ядра. После нескольких часов, проведенных с отладчиком VS и Procmon, я обнаружил, что VS не может загрузить сборку, потому что он не может разрешать неуправляемые библиотеки, от которых зависит оболочка. VS выполняет поиск в каждой системной папке и папке из переменной среды PATH, но не в папке, где расположена сборка оболочки.

Кроме того, у меня есть 2 формы в одной сборке, одна унаследована от другой: VS конструктор форм прекрасно загружает родительскую форму и не может загрузить унаследованную форму.

Итак, вот мой вопрос: кто-нибудь знает причину такого поведения?

Постскриптум Я использовал обходной путь: добавил папку с двоичными файлами проекта в переменную PATH, но я все еще хочу знать причину.

3

Решение

Вы пытались поместить двоичные файлы в папку исполняемых файлов? Потому что я уверен, что .NET ищет только известные пути (поскольку путь хранится в %ДОРОЖКА% ) и локальная папка исполняемого файла.

Я не знаю точную причину этого, но я думаю, что это потому, что DLL не знает путь, откуда она была загружена (управляемые DLL делают!), И ищет только текущий каталог и другие известные пути.

Но для этого есть обходной путь: вы можете создать исполняемый файл для Visual-Studio и выполнить одно из следующих действий:

SetDllDirectory-сниппета:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern Boolean SetDllDirectory(String pathName);
0

Другие решения

Других решений пока нет …