是否可以通过 Dotnet 互操作和 C# 使用免注册 COM?如果是这样,如何在 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 Dependency”设置为“type='win32' name='TestComSvr1' version='1.0.0.0'”,之后只要 COM 组件存在,cpp 客户端就能正确运行位于同一目录中。
但 C# 客户端根本拒绝玩。
尝试添加对未注册的 COM 组件 dll 或未注册的 tlb 的文件引用会导致错误:
“无法添加对‘blah blah’的引用。请确保该文件可访问,并且它是有效的程序集或 COM 组件”。
仅使用“regtlib TestComSvr”注册类型库,然后创建对此的文件或 COM 引用会导致 c# 项目无法使用以下命令进行构建:
“加载类型库/Dll 时出错。(HRESULT 异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))”。
在 c# 项目中正常注册 COM 组件并创建引用,将引用设置为“隔离”,构建 c# 项目,然后取消注册该组件并运行 c# 项目会导致此异常:
由于以下错误,检索 CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} 的组件的 COM 类工厂失败:80040154 类未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。
注意:即使这有效,它也不是一个有用的案例,因为最终它仍然需要注册组件,我只是测试了它的彻底性。
到目前为止,我能够从 C# 引用 COM 对象的唯一方法是注册 COM 对象本身,这当然完全违背了这一点,因为它根本就不是免注册的。
有人有什么想法吗?
(这是在带有 VS2010 sp1 的 WinXP 上)。