2009-12-10 93 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年以來)