Как зарегистрировать DLL с помощью PowerShell без RegAsm

У меня есть приложение ASP Classic, которое ссылается на некоторые COM-объекты Visual Basic 6.0. Один из этих COM-объектов Visual Basic 6.0 ссылается на другую стороннюю DLL.

Сторонние библиотеки DLL должны быть зарегистрированы на компьютере под управлением Windows Server 2008 R2 x64.

Я нашел сценарии для регистрации DLL в GAC без GACUTIL, используя PowerShell (ссылка: http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell.aspx).

Теперь мне нужно зарегистрировать сборку. Я использовал GACUTIL и RegAsm на своей локальной машине для разработки (x86) без заминки. Но когда я пытаюсь получить DLL на тестовом сервере, у меня возникают проблемы.

Первый выпуск: нет GACUTIL.

То есть на сервере нет GACUTIL, который я использовал, используя скрипт, упомянутый выше.

Вторая проблема: RegAsm не может найти сборку.

RegAsm под 32-разрядной.NET Framework не находит DLL. Сообщение об ошибке:

RegAsm: ошибка RA0000: Невозможно найти входную сборку "C:\Windows\System32\xxxxx.dll" или одну из ее зависимостей.

Поэтому я использовал 64-битный вариант, и это сработало.

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

Компонент ActiveX не может создать объект.

Вообще говоря, это происходит потому, что он не может найти объект для создания, а это означает, что DLL-библиотека, в которой находится объект, зарегистрирована неправильно.

Поэтому я пытаюсь выяснить, существует ли альтернативный метод RegAsm, использующий PowerShell.

Возможно ли это, и каким будет сценарий, чтобы сделать это правильно?

4 ответа

Решение

Я обнаружил, что помещаю.NET DLL в неправильную папку на тестовой машине для регистрации.

В 64-битной ОС Windows у вас есть папки System32 и SysWOW64. Я поместил свою DLL в папку System32, где она должна была находиться в папке SysWOW64.

Ошибка, которую я получил от RegAsm:

RegAsm: ошибка RA0000: невозможно найти входную сборку "C:\Windows\System32\xxxxx.dll" или одну из ее зависимостей

должен был заставить меня щелкнуть, но я пропустил это.

По сути, 32-разрядный RegAsm не смог найти мою DLL, но 64-разрядный RegAsm смог найти мой файл, и, зарегистрировав сборку в 64-разрядном RegAsm, я поместил DLL в 64-разрядную область. Мне нужно, чтобы это было в 32-битной области.

Я переместил DLL-форму System32 в SysWOW64, и 32-битный RegAsm нашел DLL и зарегистрировал ее в 32-битной области.

Теперь мой COM-объект Visual Basic 6.0 может найти.NET DLL, и он работает без ошибки "Компонент ActiveX не может создать объект".

Несмотря на все сказанное, я не нашел библиотеку или функцию, которая будет выполнять ту же работу, что и RegAsm, без фактического использования RegAsm.

Если кто-нибудь найдет этого мифического зверя, пожалуйста, ответьте на этот вопрос.

Не уверен, но ваша проблема, похоже, связана с побочным эффектом виртуализации UAC (эта статья также может помочь), который существует в Vista и все еще действует здесь. Суть в том, что системные части файловой системы и реестра теперь защищены от доступа пользователей, но если предположить, что старые (32-разрядные) программы продолжают работать в системе, заставьте их поверить, что они пишут на этих частях, но на самом деле он перенаправляет их на пользователя. мест. Загляните в "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node" в вашем реестре.

Проблема, с которой я недавно столкнулся, состоит в том, что мой MSI был собран с 32-битной библиотекой, поэтому при вызове этих библиотек во время установки на 64-битную машину виртуализация UAC устанавливает мои ключи реестра в Wow6432Node. Эта статья в интернете помогает мне решить проблему. Я использую Orca, чтобы заменить Installutillib.dll от 32 до 64 бит.

RegAsm а также GacUtil предназначены для сборок.NET. Для COM-компонента (в DLL) вам нужно использовать regsvr32.exe,

Регистрация COM - это совершенно другой процесс для.NET, и regasm заполняет пробел, оборачивая сборку.NET в COM-прокси, чтобы сделать ее пригодной для использования в COM - это одна из возможностей взаимодействия.

НЕТ GACUTIL

GacUtil поставляется с.NET SDK, для систем, не предназначенных для разработчиков, его работа должна выполняться установщиком.

Если вы хотите использовать regsvr32.exe в PowerShell, сначала используйте CMD. Это откроет окно cmd в PowerShell. Это просто хитрый трюк, который я выучил, но я уверен, что вы уже знаете, как это работает с DLL и COM-объектами COM для Windows.

Другие вопросы по тегам