2009-12-06 85 views

回答

3

你,我知道有兩種選擇:

1)你可以編譯COM支持C#DLL,然後通過COM從C++訪問它。這將涉及COM Interop,它可能比被管理的.NET調用慢。

要編譯COM支持的C#DLL,請轉到項目的Properties-> Application-> Assembly Information-> Make assembly COM-Visible。您使用regasm在用戶計算機上註冊DLL。這是類似於使用REGSVR32,除了regasm是.NET的DLL:

http://www.csharphelp.com/archives/archive190.html

我個人也使用與regasm的/ CODEBASE開關,我打算成爲唯一的COM使用的DLL。它仍然可以在沒有/ CODEBASE開關的情況下工作,但是DLL也會出現在全局程序集緩存中,這隻會給GAC增加混亂,並將你登錄到我不需要用於COM互操作場景的很多功能中。

您還可以在Build下設置「Register for COM-Interop」,但這不是必需的。這在重複調試時非常有用,因爲它在編譯時會在您的機器上註冊具有regasm的COM DLL。它本身並沒有什麼關係。你仍然需要在用戶的機器上重新設置DLL。

註冊後,您應該能夠添加COM引用到C#DLL,並從本地C++調用它,就像您使用其他COM組件一樣。

或者

2)你可以編譯C++項目的託管C++/CLI的項目,可以讓您引用的DLL的.NET,如C#DLL。如果C++/CLI對你來說不是問題,我認爲這將是更好的選擇。 C++/CLI代碼和C#DLL之間的調用應該比COM Interop執行得更好,但另一方面,C++/CLI本身比本地C++稍慢。

+1

如何從COM訪問它? 我不想使用託管C++。使用託管的C++會影響性能嗎? – 2009-12-06 20:46:05

+0

是和否。一般情況下,託管C++的性能比本地C++稍差。但在你的情況下,你正在考慮把COM調用變成一個叫做COM互操作的C#.net DLL,並且在我的經驗中,COM互操作比一個託管到管理的調用慢。我將添加關於如何將C#DLL作爲COM DLL進行編譯的信息,如果您決定這是您想要執行的操作。 – AaronLS 2009-12-06 20:57:01

+0

非常感謝。是的,我想。所以你認爲業績在這裏不是一個大問題? – 2009-12-06 21:18:39