2011-11-09 91 views
2

我使用Visual Studio 2010和C#来构建应用程序的WinForms和类库。我有一些用于所有产品的公共库,然后是我的应用程序的一些产品特定库。我的组件都没有GAC'd。所有项目将其输出从各自的bin \ Debug文件夹复制到一个公用的Repository文件夹,并且所有组件引用都指向该Repository文件夹。Visual Studio 2010的大会参考文档

例如,Common.DAL.dll,Common.BLL.dll,Product.DAL.dll,Product.BLL和Product.exe

组件之间的引用通常是这样的:

  • Product.exe包括提及Product.BLL
  • Product.BLL包括到Common.BLL和Product.DAL引用
  • Product.DAL包括提及Common.DAL
  • 通讯on.BLL包括当所有这些都包含在同一个解决方案refrence到Common.DAL

,构建depencies是这样的:

  • Common.BLL取决于Common.DAL
  • Product.DAL取决于Common.DAL
  • Product.BLL取决于Common.BLL和Product.DAL
  • Product.exe取决于Product.BLL

这使得构建顺序是这样的:

  1. Common.DAL
  2. Common.BLL
  3. Product.DAL
  4. Product.BLL
  5. Product.exe

通常情况下,试图运行一个应用程序时,我得到以下错误:

无法加载文件或程序集“Common.DAL,版本= 1.0.0.0,文化=中性公钥= 4e5249f2e70e1da8”或它的一个依赖。该系统找不到指定的文件。

我已经查明问题到一个事实,即在Product.exe的bin \ Debug文件夹不是所有的解决方案建立在组件结束。

如果我清洁解决方案,然后重建它,文件显示是这样的:

  • Common.DAL \ BIN \调试包含Common.DAL.dll
  • Common.BLL \ BIN \调试包含Common.BLL.dll和Common.DAL.dll
  • Product.DAL \ bin \ Debug包含Common.DAL.dll和Product.DAL.dll
  • Product.BLL \ bin \ Debug包含Common.BLL。 dll,Common.DAL.dll, Product.BLL.dll和Product.DAL。dll的
  • 但Product.exe \ BIN \调试只包含Product.exe,Product.BLL和 Product.DAL。 它缺少公共程序集。所以当我运行 Product.exe时,出现上面列出的错误。

我检查了我所有的项目和属性的属性。它们都使用.NET Framework 4.对我的程序集的所有引用都将“特定版本”属性设置为false,并将“复制本地”属性设置为true。

我可以缺少的组件,以通过增加在Product.exe项目共同组件引用复制到Product.exe \ BIN \调试,但由于Product.exe不明确使用常见的组件,这感觉更像是一个混乱而不是解决方案。

我已经通过MSDN和Visual Studio文档看了看,如果我能找出什么影响或影响引用的程序集的拷贝,我已经如此搜查了类似的问题,但我还没有发现任何有用的。

我在为去哪里或下一步要做什么损失。

+3

为什么你不希望使用项目参考?如果你到处使用项目引用,你是否仍然有这个问题? – McKay

+0

我们在少数几个项目中遇到过这种情况,最终以“copylocal = true”引用了最上面程序集(* .exe或网站)中的所有程序集。这是一种解决方法,我也想知道这种行为的真正原因是什么。 –

+0

@McKay,当项目全部存在于同一个解决方案中时,项目引用才是有效的。很多时候,所有的项目都不会采用相同的解决方案。 Common.DAL和Common.BLL程序集通常不在Product.exe解决方案中,甚至Product.DAL和Product.BLL项目也不一定必须位于Product.exe解决方案中。 –

回答

3

在你的问题你说:

I can force the missing assemblies to be copied to Product.exe\bin\Debug by adding references to the Common assemblies in the Product.exe project, but since Product.exe doesn't explicitly use the Common assemblies, this feels more like a kludge than a solution.

我不认为我同意。这并不完美,但Visual Studio有时甚至需要内部解决方案。这取决于你如何使用课堂。

虽然你可能认为这是一个小杂牌,好像你的其他(我敢说“缺憾”)的要求(每一个解决方案项目)使事情似乎缺憾

+0

好吧,不管与否,我必须回答这个问题,因为它对我们的开发过程影响最小。我们无法重新构建我们正在开发和维护的构建流程和所有项目和解决方案。感谢您的反馈。 =) –

2

您应该只参考裸组件的时候都相对稳定,外解决方案的

在您的解决方案中,从项目选项卡中引用它们。这将使VS在项目之间配置正确的依赖关系和构建顺序。

在当前设置,核实项目的依赖关系(解决方案|属性)。

+0

我不同意。如果我这样做了,那么无论何时我将任何项目添加到解决方案中,我都需要添加_that_项目引用的所有项目,或将所有项目引用更改为新位置。如果我在Repository文件夹中对所有程序集进行了引用,则无需更改它们,无论它们包含哪个解决方案。 –

+0

我会在此处与Henk一起去。如果你有很多解决方案都被划掉了,你有什么是意大利面条建筑。如果在很多解决方案中有很多项目涉及引用项目:或许是时候考虑制作一些接口DLL并完全复制下面的复杂实现。使逻辑组件与它们之间的接口。 – zmilojko

+0

@zmilojko,我不太确定我是否遵循。你是说如果我引用一个程序集来引用另外5个程序集,我应该总是在我的解决方案中包含那5个其他程序集?那些程序集中的任何程序集都引用了什么? –