如何将聚合 .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 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在vb6中注册一个不能用作com互操作的.net DLL?

如何将 NotifyIcon 添加到 ATL 进程外服务器

如何通过 COM 互操作在 .NET 对象上调用静态方法?

.NET Com 互操作帐户

我可以将 MFC 支持添加到现有 ATL COM 项目吗

如何将 WTL 和 ATL 添加到 Visual Studio C++ Express 2008