C#Interop - 无法创建对象

3Da*_*ave 2 c# com interop wsh

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

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

错误:无法creawte对象命名

"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);

}
Run Code Online (Sandbox Code Playgroud)

这工作正常.但是,尝试从VBscript创建对象仍然失败.

哎呀.

更新,第二个

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

我已经尝试注册%windir%\microsoft.net\framework\v4...framework64版本regasm,没有任何效果.

Han*_*ant 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密钥的位置.