如何将聚合 .NET COM 互操作添加到 ATL EXE 服务器?
Posted
技术标签:
【中文标题】如何将聚合 .NET COM 互操作添加到 ATL EXE 服务器?【英文标题】:HOWTO add aggregate .NET COM Interop to an ATL EXE Server? 【发布时间】:2010-12-25 07:40:27 【问题描述】:我想知道如何将 .NET C# COM 对象(使用 .NET 的 COM 互操作工具创建)添加到 Visual Studio 2008 ATL EXE 服务器。基本上,我正在尝试创建一个进程外自动化服务器来保存我的 C# COM 对象,以允许它充当许多客户端的单例服务器。我认为我需要做的就是将正确的条目添加到 ATL EXE 服务器的 IDL 文件中?这听起来对吗?那么有人还会知道如何实际实例化我的 C# COM 对象吗?我猜我需要重新定义它的 GUID,否则它会立即实例化 C# 吗?感谢您的帮助。
-大卫
例如: .
import "oaidl.idl";
import "ocidl.idl";
[
uuid(A9F9E81F-D5FE-4718-8078-E8378CFB3D3C),
version(1.0),
helpstring("Libreria dei tipi SSOLoginDLLServer 1.0")
]
library SSOLoginDLLServerLib
importlib("stdole2.tlb");
import "SSOLoginDLL.tlb"; <-- Reference included to my C# project which creates the TLB
[
uuid(A8FD5BC5-3B8D-4828-B9CB-6496A7A6D9B9)
]
coclass CSSOLogin
[default] interface ISSOLogin;
[default, source] dispinterface ISSOLoginEvents;
;
;
【问题讨论】:
听起来你有三个问题有点混乱......(1)如何在ATL中创建COM服务器; (2) 如何使该服务器成为单实例和/或使实例共享单例资源; (3) 从该服务器(或资源)中如何实例化和使用另一个 COM 对象(恰好在 .NET 中实现)。你能澄清一下你坚持哪一个吗? 另外两个我可以验证/测试一旦我得到你的#3 的答案 :),所以我想说我如何让 ATL EXE COM 服务器向外界提供另一个已经编写好的 COM目的。谢谢。 【参考方案1】:所以您有一个 COM 对象(您的 ATL 服务器),它的存在唯一目的是让客户端访问另一个 COM 对象(C# 对象)。请务必注意,您不是在谈论让客户端访问 TYPE(即他们将实例化自己的 C# 对象实例),而是对实际的 INSTANCE 进行访问。
因此,您的 ATL 服务器需要定义和实现一个提供必要访问权限的接口。您可以只返回 C# 对象:
MyInterface
IUnkown GetThatComObject();
在这种情况下,客户端还需要知道 C# 库中的所有类型定义,以便在获得该对象后可以使用它。
或者你可以将它包装起来,这样客户只需要知道你的主要类型库:
MyInterface
bool TellThatComObjectFoo();
int TellThatComObjectBar();
// etc.
无论哪种方式,我认为这就是您问“[我是否] 需要重新定义其 GUID”时的意思——是的,您的 ATL 服务器定义的类型(及其 GUID)需要独立于他们碰巧使用的其他类。
(顺便说一句,对不起,我在这里没有给你正确的 IDL 或任何东西......自 1999 年以来我还没有真正创建过 COM 对象。)
【讨论】:
以上是关于如何将聚合 .NET COM 互操作添加到 ATL EXE 服务器?的主要内容,如果未能解决你的问题,请参考以下文章