GAC - 程序集在GAC中,但“无法加载文件或程序集”

时间:2010-08-03 06:37:15

标签: .net com interop gac

我有一个由Visual Studio生成的Interop dll,用于在.NET dll中使用的第三方COM对象。

我在GAC中注册了我的消费dll和Interop dll。我必须使用GAC,因为SharePoint 2010工作流正在使用这些DLL。

当执行到达我的dll调用Interop dll时,抛出以下错误“”无法加载文件或程序集“...”系统无法找到指定的文件“与预期的版本和公钥一起

如果我检查Fusion Assembly Binding Log Viewer,Interop dll的日志条目中会列出以下错误:

LOG: GAC Lookup was unsuccessful.

我可以在GAC中看到该程序集,并且它具有FileNotFound异常中指定的正确版本和公钥令牌。

发生了什么事?

4 个答案:

答案 0 :(得分:4)

问题是,除了版本和公钥有效外,Interop的处理器架构必须与调用DLL的处理器架构相匹配。当然,目标框架必须是相同的版本。

我的dll被编译为MSIL(Agnostic,AnyCPU)处理器,但由于一些奇怪的原因,Visual Studio坚持将Interop编译为x386。

(也许这通常不会导致问题,但我的SharePoint服务器是64位,这可能会导致症状出现。)

解决方案是自己编译Interop:

1 - 从GAC取消注册您的dll和Interop。

2 - 启动与您的dll所针对的.NET框架相关的Visual Studio版本的Visual Studio命令提示符 (即我在Visual Studio 2010中开发我的dll,目标是.NET 3.5 。要执行此步骤,我需要启动Visual Studio 2008命令提示符)

3 - 使用Tlbmp

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

/ machine:Agnostic 会导致Interop针对MSIL处理器架构而构建,这与我的dll相同。

4 - 删除dll项目中对Interop的旧引用

5 - 删除旧的Interop文件并将其替换为刚刚生成的文件(例如c:。\ Interop.CoolThirdParty.dll)

6 - 在项目中添加一个引用到新的Interop。

7 - 重建

8 - 在GAC中注册新构建的dll和新的Interop

它应该 开始工作。

答案 1 :(得分:2)

关闭Visual Studio ....删除所有文件夹 C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files

这可以解决你的问题......

答案 2 :(得分:0)

希望你的第三方COM对象也在机器上注册

答案 3 :(得分:0)

我在我的webconfig中的一行中收到了这一行,其中compilation.assemblies引用了GAC中的程序集。问题是有人在web.config中将程序集重定向从GAC中的版本重定向到其他一些不存在的版本。