Как устранить неполадки при регистрации / использовании DLL-библиотеки.NET COM Callable Wrapper?
Я написал C# .NET Com вызываемую оболочку DLL. Я подписал его с помощью StrongName и зарегистрировал базу кода и библиотеку типов с помощью 64-битного regasm.exe. Регистрация и все методы элемента управления отображаются в 64-битном OleViewer. Тем не менее, когда я пытаюсь использовать элемент управления из 64-разрядных \Windows\System32\cscript.exe:
Set logger = CreateObject("MyCompany.LoggerControl")
Это приводит к ошибке:
Ошибка выполнения Microsoft VBScript: компонент ActiveX не может создать объект: "MyCompany.LoggerControl"
Используя ProcMon из Sysutils, чтобы отследить это, я нахожу:
1: 41: 44.8295486 PM cscript.exe 24028 RegOpenKey HKCR \ MyCompany.LoggerControl
ИМЯ НЕ НАЙДЕНО Требуемый доступ: Читать
Тем не менее, этот ключ существует в Regedit. Вызывающий процесс выполняется из командной строки с повышенными правами. Если это была проблема безопасности, не должна ли ошибка быть "ДОСТУП ОТКАЗАНО" вместо "ИМЯ НЕ НАЙДЕНО"?
Какие есть другие инструменты, чтобы отследить этот тип ошибки регистрации элемента управления COM?
1 ответ
Вот несколько идей по устранению неполадок:
Определите точный номер ошибки, возвращаемый при попытке создать объект:
При ошибке возобновить следующее
Set logger = CreateObject ("MyCompany.LoggerControl")
If Err Then WScript.Echo "Error #" & Err.Number WScript.Echo Err.Description WScript.Quit 1 End IfПосмотрите этот код ошибки. Например, это "доступ запрещен" или какая-то другая ошибка?
Создайте исполняемый файл C# для вызова вашего объекта и посмотрите, сможет ли он успешно его создать.
Убедитесь, что у вашей DLL нет других зависимостей, которые мешают ее загрузке в каталог, в котором работает ваш скрипт. Вы можете использовать depen.exe из каталога, из которого вы запускаете скрипт, или же вы можете использовать мою любимую технику regsvr32 для бедного человека, чтобы попытаться загрузить DLL. Если библиотека DLL не загружается из-за зависимости, вы получите диалоговое окно с сообщением об ошибке, которое не может найти другую библиотеку DLL или загрузить одну из ее зависимостей. Если он может загрузить DLL нормально, он скажет, что успешно зарегистрировал ее.
C: \ PathToVbs> regsvr32 C: \ PathToYourDLL \ YourDLL.dll