VS 2005, проект веб-сайта: управляемые сборки C ++ требуют зависимостей в пути, а не bin dir? - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь создать проект веб-сайта VS 2005, который зависит от нескольких управляемых сборок C ++.Одна из управляемых сборок C ++ зависит (статическая загрузка) от неуправляемой библиотеки DLL, которая использует __declspec (dllexport) для экспорта классов.

По какой-то причине я получаю следующую ошибку сборки:

Error   4   The specified module could not be found. (Exception from HRESULT: 0x8007007E)       

(из сведений о выходе сборки):

(0): Build (web): The specified module could not be found. (Exception from HRESULT: 0x8007007E)

при сборке с неуправляемой DLL вкаталог \ Bin \ веб-сайта, но не в пути.Если я помещу неуправляемую DLL в путь, а затем перезапущу Visual Studio, она будет работать и будет работать нормально.

Примечание. Эта тема казалась связанной, но я еще не дошел до развертывания: Неуправляемые библиотеки DLL не загружаются на сервере ASP.NET

Есть лиспособ получить это .sln сборки правильно с неуправляемыми DLL в \ Bin \, а не путь?(Я бы действительно предпочел хранить их как часть веб-сайта, а не как систему)

Редактировать: Кажется, я до некоторой степени неправильно понял назначение папки \ Bin \.Похоже, ничего, кроме управляемых сборок не должно идти туда.(Таким образом, COM-объекты и другие неуправляемые библиотеки DLL, на которые я полагаю, которые я размещаю, вероятно, принадлежат где-то еще.)

1 Ответ

1 голос
/ 27 января 2012

Я считаю, что ASP.NET довольно часто копирует ваши сборки, чтобы избежать блокировки оригинальной DLL (что предотвратит перезапись новой версией). Затем, когда вы перезаписываете его, ему требуется копия старой версии, пока не будут выполнены все невыполненные запросы, а также новая версия, используемая для новых запросов.

Таким образом, ваша DLL не запускается из каталога \bin\, в который вы ее поместили, и ищет собственные зависимости, где она действительно выполняется.

Вы можете указать собственные пути к DLL или добавить код для явного копирования их в «настоящий» каталог сборки по мере необходимости. Но у вашего кода даже не должно быть разрешения на запись в файловую систему, поэтому я думаю, что вы застряли, используя путь.

Обратите внимание, что вы можете добавлять каталоги в собственную среду приложения, не влияя на глобальный путь. Например, p / invoke SetDllDirectory Не добавляйте \bin\. Поместите свои собственные библиотеки DLL в отдельный каталог, например \bin\native или \bin\x86, чтобы при изменении пути поиска не изменялось, какие управляемые библиотеки DLL были найдены.

Edit: Это работает только в том случае, если задержка управляемой DLL загружает любые неуправляемые собственные библиотеки DLL, на которые она ссылается (используя / DELAYLOAD). В противном случае компиляция global.asax (или там, где происходит установка пути) не удастся.

...