当我在解决方案中包含一些项目并将引用更改为项目引用时,有时它仍然加载错误的程序集,因为有其他东西首先调用它,而该东西未包含在我的解决方案中。 当项目数量增加时,找到这些项目变得越来越难......你与谁打交道?
我使用 Lexware 程序集引用工具...在 VS 的“工具”菜单下提供了一个菜单选项,让您查看引用是程序集引用还是项目引用、dll 的提示路径、复制本地、特定版本以及其他参考属性。 它还允许您在一个窗口中编辑这些属性。
http:// assemblyreftool.codeplex.com/ 适用于 Visual Studio 2010
http://www.codeproject.com/KB/macros/Lexware_AssemblyReference.aspx适用于 Visual Studio 2005/2008
另请注意:如果一个项目有项目引用,并且您在解决方案中有该项目,但不包含引用的项目,则引用的项目将不会构建,并且您将使用 bin 文件夹中本地复制的 dll引用项目(即引用项目的最后一次成功构建是什么)。 如果没有引用项目的 dll 的本地副本,构建将会失败。
如果在构建顺序的层次结构中,一个项目首先被编译,但具有引用的 dll 的较旧版本,那么您将陷入更高版本的困境。 原因是引用的dll被复制到bin文件夹中。 因此,当第二个项目编译时,它会在根编译项目中查找对最低 dll 的引用,并发现 bin 文件夹中已经有一个副本(尽管是旧版本)。
解决方案:
(1) 将引用的项目本身包含在您的解决方案中
(2) 将工程引用改为dll引用,引用自己独立编译的本地受控版本。
(3) 手动更改项目的构建顺序(不推荐)
一张图表希望能清楚地说明这一点:
Solution
|
--Project 1 (references project 2 and project 3)
| \bin
|
|
--Project2
| \bin
| \proj4.dll (v1.5)
|
--Project 3
\bin
\proj4.dll (v1.2)
构建解决方案时,项目 1 首先强制编译项目 3,并将所有相关 dll 复制到其 bin 文件夹中。 现在的结构如下:
Solution
|
--Project 1 (references project 2 and project 3)
| \bin
| \proj3.dll
| \proj4.dll (v1.2)
|
|
--Project2
| \bin
| \proj4.dll (v1.5)
|
--Project 3
\bin
\proj4.dll (v1.2)
接下来编译项目 2,但由于默认的 Specific-version 设置为 false,项目 1 会发现它的 bin 目录中已经有一个版本的 proj4.dll,这对于项目 2 来说已经足够了。因此它只会复制 proj2 .dll 结束,结构如下:
Solution
|
--Project 1 (references project 2 and project 3)
| \bin
| \proj2.dll
| \proj3.dll
| \proj4.dll (v1.2)
|
|
--Project2
| \bin
| \proj4.dll (v1.5)
|
--Project 3
\bin
\proj4.dll (v1.2)
如果有人不同意,请随时纠正我。 但我很确定这就是为什么你会看到你所看到的(如果我理解这个问题)。