我已经创建了一个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
版本注册,但没有效果。
答案 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)