为什么我得到" System.IO.FileNotFoundException:无法加载文件或程序集"当设置引用" copylocal = false"?

时间:2014-07-22 18:48:48

标签: c# visual-studio unit-testing filenotfoundexception copy-local

情况如下:我正在尝试使用我称之为“TestProject”的测试项目来运行单元测试。它正在测试另一个项目中的一个类,我称之为“Class1”和“Project1”。

Project1在运行时对各种dll进行一些动态延迟加载,我称之为“TheDynamicDLLs”。 Project1通过查找相对于其自己的构建输出路径的目录来查找这些dll。

问题的第一部分出现在TestProject引用Project1时。显然,它将新构建的Project1.dll复制到其OWN构建目录,然后当Project1.dll在相对于其位置的路径中查找TheDynamicDLL时,它找不到它们,因为它是从TestProject的位置运行的,而不是它的自己的。

为了解决这个问题,我去了TestProject的引用,右键单击了Project1引用,并打开了它的属性。然后我将“Copy Local”设置为“False”。我还确保引用的“Path”属性与Project1的构建路径相同。

现在我遇到了一个新问题,我甚至无法弄清楚它是什么。每当我运行单元测试时,它都会报失“System.IO.FileNotFoundException:无法加载文件或程序集[将Project1命名为不可查找程序集的信息]”。

此外,当我尝试调试单元测试时,它不会仅仅运行它,它不会抛出异常,抱怨或任何东西,从而阻止我找到有关该问题的任何进一步信息。我在测试报告中找不到任何进一步的有用信息。

以下是完整的测试报告,其名称和出于保密目的而被换出:

Test Name:  Class1_Tests
Test FullName:  TestProject.TestClass.Class1_Tests
Test Source:    c:\Code\Solution1\Tests\TestProject\TestClass.cs : line 175
Test Outcome:   Failed
Test Duration:  0:00:00.0348455

Result Message: 
Test method TestProject.TestClass.Class1_Tests threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.=== Pre-bind state information ===
LOG: DisplayName = Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Code/Solution1/Tests/TestProject/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : TestProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\Solution1\Tests\TestProject\bin\Debug\TestProject.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1.DLL.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1/Project1.DLL.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1.EXE.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1/Project1.EXE.
Result StackTrace:  at TestProject.TestClass.Class1_Tests()

从日志开始,看起来TestProject仍在尝试从其OWN#$%^ ing构建路径加载Project1的dll,尽管我明确告诉它不要复制本地。 (GRRRR ...)

我做错了什么?

1 个答案:

答案 0 :(得分:1)

!!!请注意:我发布的原始问题是关于我解决更深层问题的问题。这个答案是解决这个更深层次问题的方法,而不是问题所要求的问题。

进一步解释:最初的问题是当这些引用被设置为" CopyLocal = false"。

时,如何让运行时环境正确加载引用的依赖项。

这个问题被问到了,因为我一直在设置copylocal = false以保持依赖关系dll在其原始构建路径中运行,即使它是作为不同的单元测试项目的一部分加载和运行,这样它就能够在运行时查找位于相对于其构建路径的文件夹路径中的项目。

这个答案是第一个问题的答案,因此无需首先设置copylocal = false。因此,我不会在这里选择我的答案作为最有帮助的。如果有人对直接问题有答案,那么他们仍然应该发布它以帮助那些可能因为与我的原因不同而挣扎于此问题的人。

那就是说,这是我解决 I 设置copylocal = false所需原因的原因:

  1. 将TheDynamicDLL添加到Project1,但不作为引用添加。只需右键单击解决方案资源管理器中的Project1,然后选择"添加现有项目",然后浏览到每个dll位置并添加 AS A LINK 。 (重要的是添加为链接,以便在其DynamicDLLProject重建时刷新它。)
  2. 右键单击Project1中新添加的项目,然后选择&#34; Properties&#34;。将&#34;构建操作&#34; 设置为&#34;无&#34; 并设置&#34;复制到输出目录&#34; < / strong>要么&#34;如果更新&#34; &#34;总是复制&#34;
  3. 对于Project1将/可能在运行时加载的每个动态dll重复步骤1和2。
  4. 当然,在TestProject中,我将Project1引用设置回&#34; Copy Local = True&#34;。
  5. 这样做的结果是,虽然动态dll实际上没有被引用或编译到Project1中(因为在Project1运行时应该防止它们急于加载),任何引用Project1并将其dll复制到它们的项目输出路径,也将复制作为该项目输出的一部分添加的项目(在本例中为TheDynamicDLLs)。

    我希望能帮助任何有这个问题的人出于类似的原因。