у меня есть 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, для систем, не предназначенных для разработчиков, его работа должна выполняться установщиком.