簡體   English   中英

在C#中使用COM dll

[英]Using COM dll in C#

我們有COM dll,它是用C ++編寫的,並且已被vb 6.0中編寫的應用程序使用。 我的公司計划在.Net平台上編寫更新版本的應用程序。

就性能而言,在C#項目中使用COM dll時,我應該從下面列出的3個選項中選擇什么

  1. 只需將dll添加為com參考
  2. 用C ++ / Cli編寫包裝器DLL
  3. 使用TlbImp.exe生成包裝器DLL

或者還有其他選擇嗎?
謝謝。

在C ++ / CLI中編寫包裝器的速度可能不會更快,CLR中的COM互操作編組器已經過大量優化。 它從您添加對COM服務器的引用時創建的互操作庫自動生成機器代碼存根。 A做了很多與異常相關的非常隱形且很難做的工作。

它確保將故障HRESULT正確轉換為托管異常,並且托管異常不會泄漏到COM服務器代碼中。 當你這樣做時,你會有“快速”的決心,這會讓你像這樣偷工減料。 現在你有了快速但不可靠的東西。 在非托管代碼中獲取托管異常非常難以診斷,所有上下文都消失了。

選項1和3是相同的。 兩者都生成互操作庫,IDE只為您運行等效的Tlbimp。

通常的指導適用於此。 首先,簡單的事情是,互操作庫非常簡單。 只有在你能夠真正測量性能問題並且有一個現實的想法如何處理它時才考慮做真正的困難。 我從來沒有見過任何人認為必須使用C ++ / CLI包裝器。

選項2性能更高,但並不多,特別是考慮到DLL本身在VB6中。

不確定選項3是否有效。

我個人會使用選項1,但只是保持interop安全,以便我只是繼續重用相同的互操作,而不是每次添加引用時都不創建它。

另一種選擇是使用新的dynamic特性和后期綁定(使用Activator來創建對象),但這絕對不是所有的。

由於組件使用COM,因此最簡單的方法是將其添加為引用,並讓visual studio構建代理。 對於.net代碼,這將是非常直接和透明的。 它不會那么高效,但很可能它會滿足您的需求。 我會先這樣做,因為它很容易,然后看看它是如何表現的。

如果組件不是COM組件,而只是標准的c ++ dll,那么另外兩種方法可能是更好的選擇。

由於數據的編組,對COM的調用很慢。 我的意思是緩慢,與您不跨越Managed或COM邊界的調用相比。

如果您需要對COM組件進行大量小調用,那么在應用程序的性能關鍵部分中,您可以使用C ++包裝(並組合)它們。

如果調用次數最少,或者它們不是性能關鍵(但並非所有調用性能都很關鍵?)我只需添加對COM dll的引用。

總結轉到COM dll的refence,並測試性能。 從VB6遷移后,您將獲得極大的性能提升(.Net中的字符串處理速度更快)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM