0

我想知道如何将 .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;
 };
};
4

1 回答 1

0

因此,您有一个 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 对象。)

于 2009-12-11T23:16:44.697 回答