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,没有任何效果.
我正在运行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密钥的位置.
| 归档时间: |
|
| 查看次数: |
4396 次 |
| 最近记录: |