我有以下使用领域模型、StructureMap 和 Fluent NHibernate 的项目结构:
我遇到的问题是 Fluent NHibernate 需要以下所有内容作为网站的 bin 目录才能在运行时工作:
- Antlr3.Runtime.dll *
- Castle.Core.dll
- Castle.DynamicProxy2.dll
- FluentNHibernate.dll *
- Iesi.Collections.dll *
- log4net.dll *
- NHibernate.ByteCode.Castle.dll
- NHibernate.dll *
我遇到的问题是并非所有这些程序集都输出到我网站的 bin 目录。目前只有带有 *
的项目才能正确输出。 bin 目录中缺少粗体 中的项目。
现在,我假设这是因为我没有将它们添加为对我的 Fluent NHibernate
项目的引用。我目前仅有的引用资料是 NHibernate.dll 和 FluentNHibernate.dll。仅这两个引用就足以带来标有 *
的项目,但它们不会带来缺失的项目。
因此,我认为要让它们全部通过,我只需将它们添加为对 Fluent NHibernate
项目的引用。不幸的是,这没有任何区别; bin 目录中仍然缺少相同的项目。
我从来没有真正理解 Visual Studio 如何决定复制哪些程序集。我一直认为它是任何标记为 Copy Local=true 的程序集,但在这种情况下似乎并非如此。
当然,我可以只将所有程序集引用添加到 Website
中,但是那样就完全破坏了通过 StructureMap
松耦合项目的意义。
有谁知道程序集丢失的原因以及如何让它们正确复制?
最佳答案
您可以添加对需要这些文件出现在输出目录(在您的情况下为网站)中的项目的引用,或者您可以在构建脚本中添加构建后步骤以将它们复制。
这是 VS 和编译器“智能”判断是否实际需要引用的情况。 C# 编译器优化掉那些实际上不需要的引用。在 VS 中添加对非必需程序集的引用将确保它出现在该项目的输出目录中。但是,依赖项目只有在引用它的项目实际使用它时才会获得相同的程序集。也就是说,如果 C# 编译器没有优化它的引用。这就是为什么你需要添加对网站项目的引用,如果你走那条路的话。
就我个人而言,我就是这么做的。我真的不认为这是紧耦合,因为 NH 仍然在运行时动态解析程序集。而且我也不是不能手动替换其他字节码程序集并重新启动我的应用程序。但如果没有充分的测试,我也不会那样做,所以在某种程度上,我认为自己是基于此与 CaSTLe 耦合的。因此,我对这些引用文献并不感到厌烦。
关于visual-studio - 为什么在运行我的应用程序时会遗漏一些引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3341900/