簡體   English   中英

C#程序如何使用任何版本的COM dll?

[英]How can a C# program use a COM dll of any version?

這個問題是續集這個問題

我們正在創建一個用C ++編寫的dll,以提供對某些硬件的訪問。 該dll實現並使用COM接口訪問。 我們也有一個C#程序,該程序通過COM對象使用此dll。

我們的版本有問題。 確實,在運行C#程序時,它絕對希望使用編譯時使用的確切COM / C ++ dll版本。 即,如果C#程序是使用COM / C ++ dll 1.2.3.4編譯的,則該程序將拒絕與COM / C ++ dll 1.2.3.5一起運行。

Unhandled Exception: System.TypeInitializationException: The type initializer for 'MyDllVerify.App' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'MyCorp.MyDll.Interop, Version=1.2.3.4, Culture
=neutral, PublicKeyToken=ced78d295d1e0f2b' or one of its dependencies. The system cannot find the file specified.
File name: 'MyCorp.MyDll.Interop, Version=1.2.3.4, Culture=neutral, PublicKey Token=ced78d295d1e0f2b'   at MyDllVerify.App..cctor()

我想指示C#程序使用1.2.anything版本的任何COM / C ++ dll。

我可以在C#項目中的何處進行配置?

我建議您不要在C#項目中直接引用COM-dll。 如果這樣做,則在生成時始終會生成一個新的COM-interop-dll。 這會導致很多問題。

創建COM-interop-dll,將其存儲在庫文件夾中,並在C#項目中引用該庫將是更好的方法。 保持此COM-interop-dll盡可能靜態。 如果這樣做的話,只要您的接口不變,就可以隨意替換使用過的COM-dll。

您可以嘗試操作此互操作程序集並在那里進行1.2。*的版本檢查,如果您確實想要這樣做(我不建議這樣做,這可能會引起嚴重的混亂)。

說明:COM-interop-dll是常規的.NET程序集。 它就像C#代碼和要在C#代碼中使用的COM-C ++代碼之間的包裝器一樣工作。

COM-interop-dll不必為COM注冊。 您可以多次安裝此程序集。 但是,它要求您的COM-dll已為COM注冊。

有用的工具:

  • lb
  • 再高潮

我在上一個問題中對其進行記錄的方式沒有什么不同。 您仍然使用<bindingRedirect>允許加載錯誤版本的互操作程序集。

在實踐中不太可能工作,使用COM時弄亂DLL Hell是極其不明智的。 如果使用早期綁定,則COM無法驗證您正在調用正確的方法。 與.NET非常不同,.NET可以在運行時從程序集中的元數據中進行此類檢查。 如果C ++程序員正確地執行了操作,則他更改了更改類型的指導。 這將使您的代碼炸彈與E_NOINTERFACE一起使用,因為您將使用舊版本的向導。

不幸的是,如果他沒有這樣做,那么您的程序可能會因為諸如AccessViolationException之類的討厭內容而崩潰。 更糟糕的是,它不會崩潰,但是會調用完全錯誤的方法。

當您使用后期綁定時,失敗模式會更加溫和,當該方法不存在或者其參數已更改時,您會收到IDispatch錯誤之一。 並不是說這最終解決了任何問題,而是您仍然有一個無法正常運行的程序。 只有當您喜歡危險地生活時,DLL Hell才會如此混亂。

暫無
暫無

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

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