簡體   English   中英

無法在COM可見類庫C#中加載文件或程序集

[英]Could not load file or assembly in COM visible class library C#

我創建了一個類庫項目,並安裝了Newtonsoft.Json NuGet包。 此操作添加了一個app.config文件,其中包含:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

然后,使類庫COM可見:

使庫COM可見

當我嘗試在另一個C#WinForms項目中使用我的類庫時,出現錯誤:

System.IO.FileLoadException:無法加載文件或程序集“ Newtonsoft.Json,版本= 4.5.0.0,區域性=中性,PublicKeyToken = 30ad4fe6b2a6aeed”或其依賴項之一。 找到的程序集的清單定義與程序集引用不匹配。 (來自HRESULT的異常:0x80131040)

直到在WinForms項目中添加了相同的app.config行。

現在,我試圖在Microsoft Word VBA開發人員中使用我的程序集(通過COM引用),並且遇到相同的錯誤,但是我無法為Microsoft Word創建app.config文件,可以嗎? 有什么辦法可以解決這個問題?

提前致謝!

是的,這是制作.NET程序集[ComVisible]時遇到的標准DLL Hell問題。 CLR使用其常規方法來查找相關程序集,而這些規則在COM中不會更改。 它首先在GAC中查找,然后在EXE所在的目錄中查找。 不在 [ComVisible]程序集所在的目錄中查找。 否則,使用Fuslogvw.exe很容易看到一些東西,請務必進行練習。

有多種解決方案,都不是理想的解決方案,因此您必須選擇最適合自己的解決方案。 您應該強烈追求的第一件事是擺脫.config文件。 <bindingRedirect>始終生成,但通常不必要。 僅當您引用多個Nuget程序包並且它們對於要使用哪個版本的Newtonsoft.Json.dll不一致時,才真正需要它。 如果這是一個問題,則只有將其部署到Office文件夾中才是可行的,請參閱最后一個項目符號。

  • 將所有內容部署到GAC。 這通常是COM的理想解決方案,因為注冊是在整個計算機范圍內進行的,所以通常會遇到嚴重的DLL Hell問題。 這使得部署更新很危險,您可能在一個程序中解決了一個問題,但又破壞了另一個程序。 缺點是安裝要求。 還有將Newtonsoft.Json.dll放入GAC的可疑做法,GAC是一個具有非常不透明的版本控制歷史記錄並被許多其他程序使用的程序集。 非零賠率會破壞使用它的另一個應用程序,因為它現在將副本加載到GAC中,而不是其本地副本中。 FUD的強度足以避免這種情況。

  • 使用ILMerge,因此您只有一個DLL。 並不總是有效,它不能處理混合模式程序集,也不能處理綁定重定向。 試試看,您會很快發現。 除此之外,唯一的缺點是額外的構建步驟。

  • 訂閱AppDomain.CurrentDomain.AssemblyResolve事件,並幫助CLR查找依賴關系。 當您公開有限數量的類或只有少數具有依賴項時,此方法很實用。 最好在類的靜態構造函數中訂閱事件,以便事件盡早發生。 確保只做一次。 確保在沒有調試器的情況下測試發布版本,抖動可能需要依賴項才能開始運行任何代碼。

  • 將依賴項復制到Office安裝文件夾中。 這就是CLR在檢查GAC之后將要處理的地方。 如果您需要bindingRedirect,則還需要將配置文件也復制到那里,重命名為Excel.exe.config以匹配Office程序名稱。 缺點是管理員不喜歡您弄亂該文件夾。 還有兩個程序執行此操作的問題,第二個可能是在您完成項目數年后覆蓋DLL或.config文件。 這不是您的問題,無論如何您都會收到一個丑陋的電話。

暫無
暫無

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

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