У меня проблема с управляемой загрузкой сборки, возникающая в результате процесса смешанного режима. Смотрите ниже для деталей. Предположим, что BinPath и ExecutablePath являются двумя действительными путями, которые не совпадают.
У меня есть веб-приложение, которое было запущено в BinPath, и создает процесс, используя следующую ProcessStartInfo:
new ProcessStartInfo()
{
FileName = ExecutablePath + "PerformanceRunner.exe",
WorkingDirectory = ExecutablePath ,
UseShellExecute = true
};
Затем PerformanceRunner.exe успешно загружает несколько неуправляемых библиотек DLL, которые находятся в ExecutablePath (это проверяется, просматривая окно модулей в VS). Затем он пытается загрузить управляемую сборку, также расположенную в ExecutablePath, но это не удается. Вот журнал объединения этого: обратите внимание, что BinPath — это «G: \ TOPSS \ TOPSS New \ Common \ Service \ Bin», а управляемая сборка — TPSSCDQ.dll. TPSSCDQ находится в ExecutablePath.
* Запись журнала переплетов сборки (29.11.2012 @ 16:16:11 PM) *
Операция не удалась. Результат привязки: hr = 0x80070002. Система не может
найти указанный файл.Менеджер сборки загружен из:
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ clr.dll Работает под
исполняемый файл G: \ TOPSS \ TOPSS New \ Common \ Service \ Bin \ PerformanceRunner.exe
=== Предварительно связать информацию о состоянии ===
ЖУРНАЛ: Пользователь = CORP \ lbhra
ЖУРНАЛ: DisplayName = TpssCDQ, версия = 1.0.4612.26218, культура = нейтральная,
PublicKeyToken = null (полностью указано)ЖУРНАЛ: Appbase = file: /// G: / TOPSS / TOPSS Новый / Общий / Сервис / Корзина /
ЖУРНАЛ: Initial PrivatePath = NULL
ЖУРНАЛ: Динамическая база = NULL
ЖУРНАЛ: Cache Base = NULL
ЖУРНАЛ: AppName = PerformanceRunner.exe
Вызывающая сборка: (неизвестно).
===
ЖУРНАЛ: Это связывание начинается в контексте загрузки по умолчанию.
ЖУРНАЛ: Файл конфигурации приложения не найден.
ЖУРНАЛ: Использование файла конфигурации хоста:
ЖУРНАЛ: Использование файла конфигурации машины из
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config.ЖУРНАЛ: Политика не применяется к ссылке в настоящее время (частная,
пользовательская, частичная или привязка сборки на основе местоположения).ЖУРНАЛ: Попытка загрузки нового файла URL: /// G: / TOPSS / TOPSS New / Common / Service / Bin / TpssCDQ.DLL.
ЖУРНАЛ: Попытка загрузки нового файла URL: /// G: / TOPSS / TOPSS New / Common / Service / Bin / TpssCDQ / TpssCDQ.DLL.
ЖУРНАЛ: Попытка загрузки нового файла URL: /// G: / TOPSS / TOPSS
Новые / Общие / Услуги / Bin / TpssCDQ.EXE.ЖУРНАЛ: Попытка загрузки нового файла URL: /// G: / TOPSS / TOPSS New / Common / Service / Bin / TpssCDQ / TpssCDQ.EXE.
ЖУРНАЛ: Все зондирующие URL-адреса были попытки и не удалось.
Я не совсем понимаю, что такое PrivatePath, Appbase или Dynamicbase, но не должен ли хотя бы один из этих путей быть рабочим каталогом (ExecutablePath)? С помощью GetCurrentDirectory я проверил, что рабочий каталог установлен правильно. Я действительно ценю руку с этим, поскольку я довольно смущен.
Вы правы, он должен искать в корневой папке, где хранится исполняемый файл. Он не будет выглядеть в рабочем каталоге — но я понимаю, что в этом случае эти пути одинаковы. Если вы посмотрите на свое сообщение об ошибке, APPBASE
настроен правильно, поэтому я думаю, что он смотрит в нужном месте, но не находит его по другим причинам.
http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.90).aspx
Другие вещи, чтобы проверить:
Кроме того, как вы загружаете эту сборку? Он указан в качестве ссылки на проект или вы вызываете Assembly.Load (или аналогичный)?
Других решений пока нет …