帮助调试的提示“无法加载文件或程序集X或其依赖项之一”

时间:2010-02-15 01:27:45

标签: .net exception visual-studio-2010 assembly-resolution

我正在寻找有助于调试应用程序负载问题的提示/建议/见解; 无法加载文件或程序集 ...

我遇到此问题的解决方案/项目是从Visual Studio 2008中的工作副本到Visual Studio 2010 Release Candidate的转换。转换过程似乎是成功的,所有解决方案项目都设置为 Framework 4

例外是在第三方组件(图形处理库)上,但任何答案都可能帮助其他人处理任何麻烦的DLL。

  

无法加载文件或程序集“Aurigma.GraphicsMill.DLL”或其依赖项之一。不是有效的Win32应用程序。 (HRESULT异常:0x800700C1)

这个例外令人困惑的是附加文本:不是有效的Win32应用程序

PasteBin上有完整的异常堆栈跟踪,但似乎没有对此问题有更多了解......

到目前为止我所尝试的并没有成功:

  1. 简单清理,重建,重新启动Visual Studio 2010 RC的组合。
  2. 删除并重新添加有问题的DLL。
  3. 在有问题的DLL上将“copy local”切换为true和false。
  4. 确认在“成功构建”之后,有问题的DLL出现在bin \ debug文件夹中。
  5. 检查对相关DLL的任何不必要的引用(找不到)。
  6. 相关DLL的相关许可文件与其位于同一目录中。
  7. 在应用程序加载时遇到任何调试器断点,我也没有运气。

7 个答案:

答案 0 :(得分:34)

我发现这个问题的原因是因为你已经切换到.net v4,你现在在IIS7中特别为asp.net v4使用一个新的应用程序池(该池本身被称为'ASP.NET v4 0.0' )

在应用程序池的高级设置部分中,将“启用32位应用程序”设置为true,您的问题DLL现在将按预期加载。

如果您的Web应用程序有自己的应用程序池,显然您应该这样做。

如果您使用的是Windows Server 2008(而不是R2),请参阅this post on how to assign correct permissions for your application pool identity

答案 1 :(得分:6)

当我的可执行项目设置为Any CPU并且引用了使用x86编译的dll时,我遇到了类似的异常。

尝试将可执行文件设置为x86,看看它是否有效。如果它没有尝试fusion log来获取有关错误的更多详细信息。

答案 2 :(得分:6)

提示

我们进行的一项调查途径解决了部分问题,但未解决整体问题,是x86(32位)和x64(64位)程序集相互引用的混合。

确保具有32位程序集,具体取决于/引用64位程序集。

答案 3 :(得分:5)

这是因为您尝试加载二进制依赖项(Bin文件夹中的一个文件),即32位,并且您的应用程序在64位模式下运行。

在.Net 4和IIS 7中,应用程序池默认以64位模式运行。

大多数.Net二进制文件在其构建属性中设置Any CPU进行编译。这意味着它们可以在32位和64位模式下工作。

用.Net 编写的大多数C ++和C应用程序需要专门针对32位或64位进行编译。这意味着如果您使用了错误的bin部署版本的依赖项,则无法加载。

这可以通过以下方式解决:

如果您想保留32位参考/依赖性:

  1. 专门设置IIS应用程序以32位模式运行。
    • 在IIS管理中;
    • 应用程序池 - >高级设置(右侧)
    • “启用32位应用程序”设置为True。
    • 重新启动应用程序池
  2. 在GAC中安装两个程序集(32位和64位)。 IIS将根据操作环境加载正确的版本(在您的情况下,这似乎是64位)。
  3. 如果你只想让它运转起来:

    1. Bin文件夹中的32位二进制文​​件替换为64位二进制文​​件。 IIS加载它时不会有问题。

答案 4 :(得分:2)

奇怪的是,我遇到了同样的问题,我在应用程序池的高级设置中允许32位应用程序中放入'false',然后它就可以了!

答案 5 :(得分:1)

更改应用程序池的高级设置部分 - >将'启用32位应用程序'设置为true可以解决我的问题。

答案 6 :(得分:0)

检查DLL是否被阻止。 右键单击Dll>属性>解除阻止。