Развертывание .NET COM dll, получение ошибки (0x80070002) - PullRequest
1 голос
/ 23 марта 2010

У меня есть сборка .NET COM, которую я пытаюсь развернуть на веб-сервере (IIS 6 Win 2003). Мы успешно развернули эту сборку в нашей тестовой среде, но производственная среда не работает.

Сборка вызывается с классической ASP-страницы. Каждый раз, когда эта страница пытается инициализировать сборку с помощью «Set LTMRender = CreateObject("LTMRender.Render")», я получаю сообщение об ошибке «Error Type:, (0x80070002)».

Эта ошибка указывает на то, что в разрешении отказано или тип файла не найден.

Я создал тестовое приложение, чтобы проверить, работает ли сборка за пределами веб-страницы. .Exe инициализирует сборку, а затем выполняет вызов, предназначенный для сбоя, что, в свою очередь, заставляет сборку создать файл журнала. Он работает, если я запускаю .exe в той же папке, что и сборка, но не работает, если я запускаю его в другом месте.

По какой-то причине сборка недоступна извне ее папки.

Я не могу понять, почему это не сработает. Вещи, которые я подтвердил:

  • Папка развертывания имеет соответствующие разрешения.
  • Мы подтвердили, что папка, в которой установлена ​​сборка, имеет правильные разрешения для всех необходимых учетных записей пользователей.
  • Сборка подписана строгим именем и зарегистрирована с помощью regasm.exe C: _WebSites \ LTMRender \ LTMRender.dll / codebase /tlb:C:_WebSites\LTMRender\LTMRender.tlb. Regasm сообщил об успехе.
  • В сборке правильно заданы атрибут и соответствующие GUID.

Какие-нибудь советы?

EDIT

Мы запустили filemon против моего testapp.exe и, похоже, указали на проблему. Когда testapp.exe запускается в папке D: _websites \ DocWebV2 \ или D: _websites \ DocWebV2 \ LTMRender \, он успешно работает, и файлmon показывает D: _websites \ DocWebV2 \ LTMRender \ pinPDF.dll SUCCESS

Если я запускаю свой testapp.exe в D: _websites \ DocWebV2 \ Client - там, где запускаются мои asp-страницы, отображается D: _websites \ DocWebV2 \ pinPDF.dll ИМЯ НЕ НАЙДЕНО, а затем D: _websites \ DocWebV2 \ pinPDF \ ФАЙЛ pinPDF.dll НЕ НАЙДЕН

Я не уверен, почему он не ищет нужную папку, если она находится только в этой конкретной папке.

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Нашел проблему с этим. Не совсем уверен, что понимаю это, но у меня все работает. Особая благодарность nobugz за то, что заставил меня сосредоточиться на пути.

Filemon показывал зависимую (управляемую .NET) .dll, найденную в нашей тестовой среде, но не рабочую.

Ключевым моментом было то, что при работе наша сетевая команда выбрала развертывание в другой папке, чем тестирование, поэтому у нас было:

PROD
D: _Websites \ DocWebV2 \ LTMRender
TEST
D: _Websites \ LTMRender

Когда я изменил TEST, чтобы использовать ту же структуру папок, что и PROD, проблема была воспроизводимой.

Моя сборка, являющаяся COM .dll, была найдена, поскольку она была зарегистрирована. Зависимый .dll не был зарегистрирован, поэтому Windows выполняла всю проверку GAC, затем папки PATH, затем папку исполняемого процесса и не находила ее.

Я всегда предполагал, что «папка исполняемого процесса» будет папкой .dll (как она называет зависимую .dll), но похоже, что веб-страница - это исполняемый процесс.

Теперь я не понимаю, почему проверяют D: _Websites \ LTMRender. Это не в нашем ПУТИ. Я предполагаю, что IIS что-то делает с этим, так как d: _WebSites - корневая папка для всех веб-настроек там. Я не эксперт по IIS, поэтому просто предположу, что он каким-то образом это контролирует.

1 голос
/ 23 марта 2010

Если файл не найден, проблема с разрешением отсутствует. 7 указывает на ошибку Windows, 2 - ERROR_FILE_NOT_FOUND. Обычная проблема с видимыми компонентами COM - это то, что Windows или CLR не могут найти зависимые библиотеки DLL. Но это должно генерировать другой код ошибки. Ищите проблемы в своем исходном коде, пытаясь открыть файлы без использования полного пути к файлу. Рабочий каталог будет отличаться на вашем сервере. Лучший способ решить эту проблему - использовать отладчик.

...