2009-12-10 44 views
0

我想知道如何将.NET C#COM对象(使用.NET的COM Interop工具创建)添加到Visual Studio 2008 ATL EXE服务器。基本上,我试图创建一个进程外的自动化服务器来保存我的C#COM对象,以允许它充当许多客户端的Singleton服务器。我认为我需要做的就是将正确的条目添加到ATL EXE服务器的IDL文件中?这听起来正确吗?任何人也有任何想法如何实际实例化我的C#COM对象呢?我猜我需要重新定义它的GUID,否则它会马上实例化C#。谢谢你的帮助。HOWTO将.NET COM Interop集合到ATL EXE服务器上?

-David

例如: 。

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; 
}; 
}; 
+0

这听起来像你有三个问题那种混乱了。 (1)如何在ATL中创建一个COM服务器; (2)如何使该服务器单实例和/或有实例共享一个单例资源; (3)从该服务器(或资源)中如何实例化和使用另一个COM对象(恰好在.NET中实现)。你能否澄清你所困扰的是哪些? – Eric 2009-12-11 03:33:42

+0

另外两个我可以验证/测试一次我有你的#3的答案:),所以我会说如何让ATL EXE COM服务器向外界提供另一个已经写好的COM对象。谢谢。 – David 2009-12-11 11:32:12

回答

0

所以,你有一个COM对象(您ATL服务器),其中存在的授予客户端访问另一个COM对象(C#对象)的唯一目的。需要注意的是,您并不是在谈论如何让客户端访问TYPE(即他们将实例化他们自己的C#对象实例),而是实际实现INSTANCE。

所以你的ATL服务器需要定义和实现一个接口来提供必要的访问。您既可以只返回C#对象:

MyInterface 
{ 
    IUnkown GetThatComObject(); 
} 

在这种情况下,客户端也需要知道从C#库中的所有类型的定义,使他们能够与该对象工作,一旦他们得到它。

,或者你可以把它包,这样客户只需要了解您的主要类型库:

MyInterface 
{ 
    bool TellThatComObjectFoo(); 
    int TellThatComObjectBar(); 
    // etc. 
} 

无论哪种方式,我认为这是你的意思是,当你问“[我会]需要重新定义它的GUID“ - 是的,ATL服务器定义的类型(和它们的GUID)需要独立于它们碰巧使用的其他类。

(顺便说一句,对不起,我不会给你正确的IDL或任何这里...我还没有真正建立一个COM对象自1999年以来)