使用C#注册免费COM互操作,可能吗?

是否可以使用注册免费COM与Dotnet互操作和C#? 如果是这样,如何在C#项目中添加对COM对象的引用?

我有一个免费的ATL COM服务器DLL,带有嵌入式清单和两个测试客户端,一个cpp,另一个c#。 cpp客户端使用import语句正确引用COM对象

#pragma comment(linker, "\"/manifestdependency:type='win32' name='TestComSvr2' version='1.0.0.0'\"") 

或者在Linker-> Manifest File选项下将’Additional Manifest Dependencies’设置为“type =’win32’name =’TestComSvr1’version =’1.0.0.0’”,之后cpp客户端只要COM组件正确运行在同一目录中。

c#客户端虽然拒绝播放。

尝试将文件引用添加到未注册的COM组件dll或未注册的tlb会导致错误:

“无法添加对’blah blah’的引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件”。

仅使用’regtlib TestComSvr’注册类型库,然后创建文件或COM引用,导致c#项目无法构建:

“加载类型库/ DLL时出错。(HRESULTexception:0x80029C4A(TYPE_E_CANTLOADLIBRARY))”。

通常在c#项目中注册COM组件并创建引用,将引用设置为Isolated,构建c#项目然后取消注册组件并运行c#项目会导致此exception:

由于以下错误,检索具有CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE}的组件的COM类工厂失败:80040154未注册类(HRESULTexception:0x80040154(REGDB_E_CLASSNOTREG))。

注意:即使这有效也无论如何都不是一个有用的案例,因为最终它仍然需要注册组件,我只是测试它的彻底性。

到目前为止,我能够从C#引用COM对象的唯一方法是注册COM对象本身,这当然完全违背了这一点,从那以后它根本就没有注册。

有人有任何想法吗?

(这是在带有VS2010 sp1的WinXP上)。

你需要:

  • 将免注册的COM条目添加到程序集清单xml文件中 ,以及
  • 将该清单构建到您的C#可执行文件中 。

  1. 您需要提供免注册的COM程序集清单,其中表明您对Neutrino.TestComSvr2程序集的依赖性:

                          true                  

    注意:我在我的问题中有一个类似的清单来自ASP.NET的免注册COM?

  2. 然后,您需要在C#exe中包含此应用程序清单:

    1. 在解决方案资源管理器中右键单击该项目。
    2. 单击“添加新项”
    3. 选择“应用程序清单文件”

这些步骤类似于MSDN上可以在托管应用程序中添加清单的步骤 。

您还需要确保您的Neutrino.TestComSvr2程序集包含它的无注册COM条目:

Neutrino.TestComSvr2.manifest

         

和blingo blango,你应该工作。