C # Interop - не может создать объект - PullRequest
2 голосов
/ 18 мая 2011

Я создал C # COM-объект и пытаюсь создать его экземпляр из VBscript (в Windows Scripting Host).

Сборка собирается правильно и т. Д., И RegAsm утверждает, что она успешно зарегистрирована. Однако всякий раз, когда я пытаюсь создать экземпляр в скрипте .vbs, я получаю:

Ошибка: не удалось создать объект с именем

Код MyProgId.blah: 80040154

Я использую Win7 x64 Ultimate, объект, созданный для .NET 3.5 с VS2010.

Я также попытался скопировать скомпилированную DLL на компьютер с Win Server 2003, и там я получил те же результаты.

справка.

Также, обратите внимание: я могу зарегистрировать, но не создавать экземпляр, любую из наших старых COM-библиотек VB6. (Да, я запускаю скрипт как администратор.)

Обновление

Только для усмешки я создал тестовое приложение, которое использует Type.GetFromProgID() для поиска и создания объекта:

Type t = Type.GetTypeFromProgID(progId);

if (t == null)
{
    Console.WriteLine("Couldn't create object.");
}
else
{
    var obj = Activator.CreateInstance(t);

    Console.WriteLine("Successfully created Object: Type is [{0}]", obj);

    Console.WriteLine("Calling method [{0}]\n\n", methodName);

    var result = t.InvokeMember(methodName, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null);

    Console.WriteLine("Result: {0}", result);

}

Это работает правильно. Однако попытка создать объект из VBscript все равно не удалась.

Argh.

Обновление, 2-е

После запуска SysInternals ProcMon я вижу довольно много запросов реестра, ищущих progID и guid в HKCU\Software\Classes\..., где нет упоминаний об объекте (когда я смотрю в RegEdit). Есть довольно много NAME NOT FOUND ошибок.

Я пытался зарегистрироваться в %windir%\microsoft.net\framework\v4... и framework64 версиях regasm, но безрезультатно.

Ответы [ 3 ]

5 голосов
/ 18 мая 2011

Я использую Win7 x64 Ultimate

Это очень актуально для таких вопросов COM. Сообщение об ошибке означает, что COM-клиент не смог найти информацию реестра для COM-сервера. 64-разрядная версия Windows имеет два интерпретатора VB-сценариев, 64-разрядную и 32-разрядную версии. Процессы с разной разрядностью имеют другое представление о реестре, 64-разрядный клиент не может видеть 32-разрядные COM-серверы. И наоборот.

Важно то, какую версию Regasm.exe вы использовали. Их два, один в C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ RegAsm.exe, другой в Framework64. По умолчанию вы запускаете 32-битную версию, которая вводит регистрационную информацию в 32-битное представление реестра. Вместо этого вы должны использовать 64-битную версию из Framework64. Или используйте оба. NET создает COM-серверы, которые могут работать в обоих битах.

Если проблема не устранена, воспользуйтесь инструментом ProcMon от SysInternals, чтобы узнать, где интерпретатор сценариев ищет ключ CLSID.

2 голосов
/ 17 июля 2012

Если вы используете 32-битный интерфейс в 64-битной ОС, вы можете обойти эту ошибку VBScript, используя wscript / cscript в \ windows \ syswow64 (вместо значения по умолчанию в \ windows \ system32) длязапустить свой скриптЭто сбило меня с толку на один день.

1 голос
/ 18 мая 2011

Я думаю, что вы, возможно, смотрите на проблему безопасности.

Ознакомьтесь с этой статьей stackoverflow и посмотрите, решит ли это вашу проблему. Невозможно создать экземпляр COM-объекта .Net на классической странице ASP / VBScript (ошибка ASP 0177)

...