26

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

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

3rd 方组件(图形处理库)例外,但任何答案都可能帮助其他人解决任何麻烦的 DLL。

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

此异常令人困惑的是附加文本:is not a valid Win32 application

完整的异常堆栈跟踪已在PasteBin上,但似乎并没有更多地说明这个问题......

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

  1. Visual Studio 2010 RC 的简单清理、重建、重新启动组合。
  2. 删除并重新添加有问题的 DLL。
  3. 在有问题的 DLL 上将“本地复制”切换为 true 和 false。
  4. 确认在“成功构建”之后,有问题的 DLL 出现在 bin\debug 文件夹中。
  5. 检查对相关 DLL 的任何不必要的引用(未找到)。
  6. 相关 DLL 的相关许可文件与它位于同一目录中。

我也没有运气在应用程序加载时遇到任何调试器断点。

4

7 回答 7

37

我发现这个问题的原因是因为你已经切换到 .net v4,你现在在 IIS7 中使用了一个新的应用程序池,专门用于 asp.net v4(池本身称为“ASP.NET v4.0” )

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

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

如果您使用的是 Windows Server 2008(不是 R2),请参阅这篇文章,了解如何为您的应用程序池标识分配正确的权限

于 2010-08-04T09:36:10.410 回答
7

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

尝试将您的可执行文件设置为 x86 并查看它是否有效。如果它不尝试融合日志以获取有关错误的更多详细信息。

于 2010-02-15T01:39:53.107 回答
7

小费

我们采取的一种调查方法解决了我们的部分问题,但没有解决整体问题,它是 x86(32 位)和 x64(64 位)程序集相互引用的混合。

确保您没有依赖/引用 64 位程序集的 32 位程序集。

于 2010-06-23T03:48:15.250 回答
6

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

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

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

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

这可以使用以下方法解决:

如果你想保留你的 32 位参考/依赖:

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

如果你只是想让它工作:

  1. Bin将文件夹中的32 位二进制文​​件替换为 64 位二进制文​​件。IIS 加载它不会有问题。
于 2013-11-08T12:24:34.270 回答
2

奇怪的是,我遇到了同样的问题,我在应用程序池的高级设置中的允许 32 位应用程序中设置了“false”,然后它就起作用了!

于 2013-07-01T11:21:54.417 回答
1

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

于 2013-01-08T08:45:58.940 回答
0

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

于 2014-11-11T23:02:03.353 回答