Как зарегистрировать 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.