我可以在JS中创建一个ActiveX(html由IE开启):
var o = new ActiveXObject("MyProgId");
但是我不能在.NET中创建它的实例:
var t = Type.GetTypeFromProgId("MyProgId");
返回null。当我尝试在VS中添加“引用COM”时,我得到了这样的错误:
"Could not add a reference to {MyTypeLib_CLSID}\1.0
Library not registered. (Exception from HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))"
当我在注册表中搜索MyTypeLib_CLSID
时,我找到了密钥但注册表无法在HKCR\Wow6432Node\TypeLib
下打开它。它抱怨Error Opening Key, The system cannot find the file specified
。但接下来我搜索,regedit在HKCU\Software\Classes\TypeLib
下找到它并在那里成功打开。
我还尝试通过Type.GetTypeFromCLSID
创建一个具有相同结果的对象(返回null)。
这个COM有什么问题?
P.S。此COM是Lync Web App插件(“ReachAppShAx.AppSharing”/ {B89F72B4-7801-4F45-97AE-F9A0CDBB6213})
更新:所有这些事情都在本地发生:js / html在浏览器中作为html文件打开,.net是一个控制台应用程序。
答案 0 :(得分:0)
使用Visual Studio实现此任务非常简单。 (说明适用于Visual Studio 2005)
引用也会自动添加到项目中。
现在你可以直接拖放你的COM组件,因为CCW(COM Callable Wrapper)应该由Visual Studio自动创建。
答案 1 :(得分:0)
似乎我理解为什么我不能在.net中为这个COM创建CCW - 这是因为这个COM是进程外的COM服务器。因此,JavaScript / IE可以无缝地处理进程外COM,但不能使用C#。
所以问题转向“如何处理.NET / C#中的进程外COM”。
我在tlbimp.exe的帮助下创建了包装器:tlbimp.exe CommunicatorWebAppVersion.exe
这创建了我添加到我的C#项目中的dll CwaAsVersionLib.dll。然后创建实例:
var o = new CwaAsVersionLib.CwaAsVersionQuery();
但是!它仅在COM服务器运行时有效。如果它正在运行,则创建实例失败并显示错误: 类未注册(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。