【发布时间】:2011-12-25 14:17:48
【问题描述】:
我正在使用 Visual Studio 2010 和 C# 来构建 WinForms 应用程序和类库。我有一些用于所有产品的通用库,还有一些用于我的应用程序的产品特定库。我的所有程序集都不是 GAC 的。所有项目都将其输出从各自的 bin\Debug 文件夹复制到一个公共 Repository 文件夹,并且所有程序集引用都指向该 Repository 文件夹。
例如,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 的引用
- Common.BLL 包括对 Common.DAL 的引用
当所有这些都包含在同一个解决方案中时,构建依赖项是这样的:
- Common.BLL 依赖于 Common.DAL
- Product.DAL 依赖于 Common.DAL
- Product.BLL 依赖于 Common.BLL 和 Product.DAL
- Product.exe 依赖于 Product.BLL
这使得构建顺序如下:
- Common.DAL
- Common.BLL
- Product.DAL
- Product.BLL
- Product.exe
在尝试运行应用程序时,我经常收到以下错误:
无法加载文件或程序集“Common.DAL,Version=1.0.0.0,Culture=neutral,PublicKeyToken=4e5249f2e70e1da8”或其依赖项之一。系统找不到指定的文件。
我已将问题归结为并非所有从解决方案构建的程序集最终都位于 Product.exe 的 bin\Debug 文件夹中。
如果我清理解决方案,然后重新构建它,文件将如下所示:
- Common.DAL\bin\Debug 包含 Common.DAL.dll
- Common.BLL\bin\Debug 包含 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\Debug 仅包含 Product.exe、Product.BLL 和 产品.DAL。 缺少通用程序集。所以当我跑步时 Product.exe,我收到上面列出的错误。
我已经检查了我所有项目和属性的属性。他们都使用 .NET Framework 4。对我的程序集的所有引用都将“特定版本”属性设置为 false,并将“复制本地”属性设置为 true。
我可以强制通过在 Product.exe 项目中添加对 Common 程序集的引用,将缺少的程序集复制到 Product.exe\bin\Debug,但由于 Product.exe 不em>明确地使用 Common 程序集,这感觉更像是一个杂物,而不是一个解决方案。
我查看了 MSDN 和 Visual Studio 文档,看看我是否可以找出影响或影响引用程序集复制的因素,并且我已经搜索了类似问题,但我没有发现任何有用的东西。
我不知道该去哪里或下一步该做什么。
【问题讨论】:
-
为什么不想使用项目引用?如果你到处使用项目引用,你还有这个问题吗?
-
我们在几个项目中遇到过这种情况,最终使用“copylocal=true”引用了最顶层程序集(*.exe 或网站)中的所有程序集。这是一种解决方法,我也想知道这种行为的真正原因是什么。
-
@McKay,只有当项目都存在于同一个解决方案中时,项目引用才有效。很多时候,所有项目都不会在同一个解决方案中。 Common.DAL 和 Common.BLL 程序集通常不会在 Product.exe 解决方案中,甚至 Product.DAL 和 Product.BLL 项目也不一定必须在 Product.exe 解决方案中。
-
您可以做的一件事是在两个程序集中包含公共项目。
-
这没有意义。您不能使用任何项目引用,曾经吗?我会关注你的构建过程......
标签: c# visual-studio-2010 assemblies