簡體   English   中英

使用C#動態引用COM dll

[英]Dynamically refer to COM dll using C#

我的C#應用​​程序將使用第三方C#COM dll。 我想以最漂亮的方式調用該dll的所有成員-像在將該dll添加到項目引用和“ using ”語句之后一樣。 但是從另一方面,我想確定系統中是否不存在dll並顯示我的應用程序中的異常(例如我可以使用后期綁定)。 因此,如何才能捕獲缺少的dll,並在使用語句后使用 Visual Studio將看到該dll的所有類型的該dll?

Com dll正在使用regasm.exe注冊。 該工具還可以從dll生成.tlb文件。 也許我可以以某種方式使用此.tlb?

Visual Studio會為您生成一個所謂的Interop-Library。 這意味着,如果您引用的庫名為MyCOMLib.dll ,它將生成一個名為MyComLib.Interop.dll的程序集。 ) you are instancing from your .NET application. 該程序集包含您要從.NET應用程序實例化的.NET包裝器對象(所謂的 )。 您可以使用TlbImp.exe -Tool自行生成此互操作庫。

因此,您實際上要實例化的不是實際的COM對象,而是充當這些COM對象的某種代理的.NET對象。 在內部,他們正在為您調用CoCreateInstanceCoCreateInstanceEx和COM類工廠。 他們還管理那些對象的內存處理。 (您可以使用Marshal.ReleaseComObject對此管理產生影響,但您應該注意這可能很危險 )。

這意味着您的應用程序確實始終與這些互操作程序集一起提供。 如果這些程序集不存在(並且您已經使用Project References引用了它們),則該應用程序將無法運行(啟動時將引發異常)。 如果程序集可以加載到應用程序的AppDomain中 ,則在創建互操作類型對象之前不會有問題。 RCW與CLSID一起調用CoCreateInstance / CoCreateInstanceEx (互操作程序集通過TlbImp.exe工具而知道)。 如果在注冊表中找不到這些類ID,則您的應用程序將拋出運行時異常。

檢查庫是否存在的一個好方法是在應用程序安裝過程中檢查唯一的庫ID和版本。 這些存儲在注冊表中。 您需要了解庫的GUID和版本,然后才能在HKLM\\Software\\Classes\\TypeLib\\{Guid}\\{Version}下找到它們。

最好的方法是將您的應用程序與第3方可再發行軟件包一起交付,后者可自行安裝該庫。 這也可以確保其他應用程序不會刪除第三方類型庫。 這就是Microsoft使用Visual C ++庫或DirectX進行處理的方式。

我想最好的方法是從progID獲取COM對象並嘗試創建它。

Type comType = Type.GetTypeFromProgID(progID);
if (comType == null)
  throw new Exception("COM object not found!);
dynamic comObject = Activbator.CreateInstance(comType);
comObject.SomeOperation();

該解決方案的附加價值在於,您的應用程序的一個版本可以與x86和x64 COM對象一起使用,因此OS版本無關緊要。

暫無
暫無

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

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