加载 some.dll 时出错:无法加载测试容器“e:\some.dll”或其依赖项之一

oɔɯ*_*ɯǝɹ 5 pinvoke mstest visual-studio-2010

我有一个VS2010 C#项目,它引用了大量本机 .dll(商业 Java 运行时)。这些文件在项目中被称为“内容”文件,因为需要与项目一起复制。

这些库中的代码使用 using 调用PInvoke,没有程序集引用。

每次我编译解决方案时,Visual Studio 测试框架都会尝试加载所有引用的 dll 文件,期望找到可能包含单元测试的 .net 程序集。由于不是 .net 程序集,因此抛出以下异常:

加载 some.dll 时出错:无法加载测试容器“e:\some.dll”或其依赖项之一。如果您将测试项目程序集构建为 64 位程序集,则无法加载它。构建测试项目程序集时,为平台选择“任何 CPU”。要在 64 位处理器上以 64 位模式运行测试,您必须更改主机选项卡中的测试设置,以在 32 位进程中运行测试。错误详细信息:无法加载文件或程序集“file:///e:\some.dll”或其依赖项之一。该模块应包含程序集清单。

这需要很多时间,我想告诉 Visual Studio 不要尝试加载这些文件。

如何告诉 Visual Studio 停止尝试加载这些文件?

saa*_*arp -1

抱歉,如果这看起来有补救作用。为了完整起见,我将其包括在内。

一般图书馆行为

可以在项目文件中引用库(因此编译器会注入代码以加载引用),也可以在运行时通过 LoadLibrary() 或 PInvoke 调用动态引用库。当加载引用的库时,运行入口点的函数可以依次加载它所依赖的任何库。加载库时,Windows 将搜索一组众所周知的路径,包括%WINDIR%\Assembly当前目录。维基百科上有很多关于此的很好的概念性信息。我建议阅读它。

可能的根本原因

我无法从您的问题中判断您在构建应用程序、构建测试或执行其中任何一个时是否遇到问题。一般来说,我不希望 PInvoke 导致编译错误。

  1. 应用程序构建期间出错: VS 通常会显示您有对它无法找到的 DLL 的引用。但是,您可能缺少满足所有依赖项所需的 DLL。要解决此问题,只需添加对缺少的 DLL 的引用即可。(这是最简单的问题,所以我猜这不是您所看到的。)
  2. 测试构建期间出错:由于您的测试将引用您的应用程序/库,因此它也需要具有相同的引用。通常,确保您获得所有内容的最简单方法是删除所有引用并添加对您正在测试的项目的引用。对于某些测试,您可能需要一些额外的库,但您的应用程序/库本身不是必需的。这些需要单独添加。
  3. 应用程序执行期间出错:启动应用程序时可能会发生这种情况,如果使用后期绑定,则在稍后调用外部库时可能会发生这种情况。
  4. 测试执行期间出错:这可能与应用程序执行时发生的情况相同。但是,测试也可以“部分构建”以仅执行少量测试。在这些情况下,某些文件可能无法复制。使用该[DeploymentItem()]属性,您可以指定测试需要测试或 app/lib 项目中存在某些文件才能运行。MSDN描述了如何做到这一点。

解决

对于#1 和#2,解决方案在于调整项目中的引用。
对于#3 和#4,可能会变得更棘手。这里有一个与您有关 Windows Mobile 的类似问题,您可能会发现它很有用,特别是指使用dumpbin列出库依赖项。您还可以使用SysInternalsprocmon来监视编译或加载期间的文件访问,以查看哪些文件未找到。然后您可以包含丢失的文件,或删除引用它的库。

祝你好运。希望这可以帮助。