C#Interop - 无法创建对象

时间:2011-05-18 15:29:27

标签: c# com interop wsh

我已经创建了一个C#COM对象,并尝试从VBscript实例化它(在Windows Scripting Host下)。

程序集正确构建等,RegAsm声称它已成功注册。但是,每当我尝试在.vbs脚本中实例化它时,我得到:

  

错误:无法创建名为

的对象      

“MyProgId.blah”代码:80040154

我正在运行Win7 x64 Ultimate,这是针对带有VS2010的.NET 3.5构建的对象。

我还尝试将已编译的DLL复制到Win Server 2003计算机上,我得到了相同的结果。

帮助。

另外,值得注意的是:我可以注册,但不能实例化任何旧的VB6 COM DLL。 (是的,我是以管理员身份运行脚本。)

更新

为了笑容,我创建了一个使用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创建对象仍然失败。

哎呀。

更新,第二次

运行SysInternals ProcMon后,我看到很多注册表查询在HKCU\Software\Classes\...下查找progID和guid,其中没有提到对象(当我查看RegEdit时)。有很多NAME NOT FOUND错误。

我尝试使用%windir%\microsoft.net\framework\v4...framework64 regasm版本注册,但没有效果。

3 个答案:

答案 0 :(得分:5)

  

我正在运行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位视图中输入注册信息。您应该使用Framework64中的64位版本。或者同时使用两者,.NET创建可以在两个位运行的COM服务器。

如果仍有问题,请使用SysInternals的ProcMon工具查看脚本解释器查找CLSID密钥的位置。

答案 1 :(得分:2)

如果您在64位操作系统下运行32位接口,则可以使用\ windows \ syswow64下的wscript / cscript(而不是\ windows \ system32下的默认值)来解决该VBScript错误运行你的脚本。这让我吵了一天。

答案 2 :(得分:1)

我认为您可能正在考虑安全问题。

查看此stackoverflow帖子,看看这是否解决了您的问题。 Cannot instanciate .Net COM object in classic ASP/VBScript page (Error ASP 0177)