为什么我不能在.NET中创建COM对象,但可以在JavaScript中创建

时间:2011-04-14 07:33:18

标签: javascript .net com activex

我可以在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是一个控制台应用程序。

2 个答案:

答案 0 :(得分:0)

使用Visual Studio实现此任务非常简单。 (说明适用于Visual Studio 2005)

  1. 打开工具箱(视图 - >工具箱)
  2. 右键单击工具箱 - >选择项目
  3. 选择“COM组件”标签。
  4. 选择您感兴趣的COM组件。
  5. 引用也会自动添加到项目中。

    现在你可以直接拖放你的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))。