2010-08-03 111 views
5

我有一個由Visual Studio生成的Interop dll,用於在.NET dll中使用的第三方COM對象。GAC - 程序集在GAC中,但「無法加載文件或程序集」

我已經在GAC中註冊了我的消費dll和Interop dll。我必須使用GAC,因爲這些DLL正在被SharePoint 2010工作流程使用。

當執行到達我的dll調用Interop dll的地方時拋出下列錯誤「」無法加載文件或程序集「...」系統找不到指定的文件「以及期望的版本和公共鍵。

如果我檢查融合集綁定日誌查看器,下面的錯誤是在互操作DLL的日誌條目中列出:

LOG: GAC Lookup was unsuccessful. 

我可以看到在GAC該程序集,它具有正確的版本和FileNotFound異常中指定的公鑰標記。

發生了什麼事?

回答

4

的問題是,還有版本和公鑰是有效的,互操作的處理器架構必須與您通話的DLL。當然,目標框架必須是相同的版本。

我的DLL被編譯到MSIL(Agnostic,AnyCPU)處理器,但由於一些奇怪的原因,Visual Studio堅持要將Interop編譯爲x386。

(也許這通常不會導致問題,但我的SharePoint服務器是64位,這可能導致症狀出現)。

解決的辦法是編譯互操作自己:

1 - 取消註冊DLL,並從GAC的互操作。

2 - 啓動Visual Studio版本的Visual Studio命令提示,該版本與.NET框架相關,您的dll的目標是(即,我正在Visual Studio 2010中開發我的dll,目標是.NET 3.5。一步,我需要啓動Visual Studio 2008的命令提示符)

3 - 使用Tlbmp

tlbimp <full path and filename of COM .tlb> /out:c:\.\Interop.CoolThirdParty.dll /keyfile: <full path and filename of snk> /machine:Agnostic /Namespace:CoolThirdParty 

/機器生成的Interop:不可知論導致互操作,以建立針對MSIL處理器架構,這是t他和我的dll一樣。

4 - 在您的DLL項目

5卸下舊參考互操作 - 刪除舊的互操作性文件,並與你剛纔生成的一個替換它(例如C:\ Interop.CoolThirdParty.dll。 )

6 - 將項目中的參考添加到新的Interop中。

7 - 重建

8 - 註冊新建DLL和新的互操作性在GAC

應該開始工作。

0

希望第三方COM對象也被登記在機器上

2

關閉的Visual Studio ....從 刪除C的所有文件夾:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \臨時ASP.NET文件

這應該解決您的問題....

0

我在compilation.assemblies中引用了GAC中的程序集,在我的webconfig中的一行中收到了此行。問題是有人在web.config中將程序集重定向從GAC中的版本重定向到其他不存在的版本。