Как обратиться к зависимости сборки в C # при использовании Assembly.loadfrom ()

Я создал библиотеку классов оболочки C ++ для импорта нативной библиотеки C ++. И я добавил ссылку на проект этой библиотеки классов C ++ в мое приложение C # и скопировал все зависимости в папку Debug. Пока что все работает нормально, если я не хочу делать тот же процесс для более старой версии этой C ++ нативной библиотеки DLL. Очевидно, у меня не может быть двух dll с одинаковыми именами и одинаковыми именами для зависимостей в папке. Поэтому я решил иметь оболочку сборки c # для каждой версии оболочки c ++ и иметь каждую сборку dll и ее зависимости в отдельной папке.

Учитывая, что я больше не могу использовать ссылку на проект, потому что требуется скопировать dll ссылки в ту же папку исполняемого приложения, я попытался использовать Assembly.LoadFrom () загрузить сборку обертки во время выполнения, и она загружает сборку, но когда она достигает линии Invkode:

bject[] p = new object[] { command, null,format,handle};
uint ret= (uint) mi.Invoke(obj,p)

Это исключение, говорящее:

Не удалось загрузить файл или сборку ‘MDVRCLib, версия = 1.0.6110.25310, культура = нейтральная, PublicKeyToken = null’ или одна из ее зависимостей. Система не может найти указанный файл.

Еще раз, если я использую эту сборку в качестве ссылки на проект и скопирую все ее зависимости в папку проекта, она будет работать нормально. Мне интересно, когда я использую Assembly.LoadFrom () для загрузки сборки из другой папки, как я могу также обратиться к зависимостям сборки, чтобы избежать такой ошибки?

1

Решение

Вы можете прикрепить к статический AssemblyResolve событие

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
//determine the required assembly using "e.Name"var filename = ".....";
return Assembly.LoadFile(filename)
};
0

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

Помимо события AssemblyResolve, элемент ‘probing’ может быть использован в файле конфигурации приложения следующим образом:

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>

PrivatePath содержит папки (относительно исполняемого файла), в которых следует искать сборки.

2