Назад | Перейти на главную страницу

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

у меня есть ASP Classic приложение, которое ссылается на некоторые Visual Basic 6.0 COM-объекты. Один из этих 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.

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

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

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

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

Я обнаружил, что помещаю .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.

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

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

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

НЕТ ГАКУТИЛА

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