【发布时间】:2012-03-24 01:36:48
【问题描述】:
是否可以将免注册 COM 与 Dotnet 互操作和 C# 一起使用?如果是这样,如何在 C# 项目中添加对 COM 对象的引用?
我有一个带有嵌入式清单和两个测试客户端的无 reg 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 时出错。(来自 HRESULT 的异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))”。
在c#项目中正常注册COM组件并创建引用,将引用设置为Isolated,构建c#项目然后注销组件并运行c#项目会导致此异常:
由于以下错误,检索具有 CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} 的组件的 COM 类工厂失败:80040154 未注册类(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。
注意:即使这有效,它也不会是一个有用的案例,因为最终它仍然需要注册组件,我只是测试了它的完整性。
到目前为止,我能够从 C# 引用 COM 对象的唯一方法是注册 COM 对象本身,这当然完全违背了这一点,因为它根本不是无注册的。
有人有什么想法吗?
(这是在带有 VS2010 sp1 的 WinXP 上)。
【问题讨论】:
-
想知道是否需要为 Visual Studio exe 本身创建清单文件?找到了这个链接,但不确定它是否有用msdn.microsoft.com/en-us/library/ms973913.aspx
-
另外,如果您使用 tlbimp 创建一个互操作 dll 并引用它会怎样?即使用 'tlbimp
'?
标签: c# visual-studio-2010 com