为运行时或编译时引用所有必需的程序集?

Reference all required assemblies for runtime or compile time?

我以为这个问题已经被问过很多次了,但我找不到。

我们正在开发应用程序,并且有多个共享程序集供多个目标使用。当我创建一个新的应用程序时,我可能会使用这样的程序集(例如框架)并在我的项目中引用它。这里一切都很好。但是,当此框架程序集使用例如模型程序集时,Visual Studio 并没有强迫我引用它。只要我的代码不涉及任何模型类型,它就可以在没有引用的情况下正常编译。

在运行时,它确实需要模型程序集。当发布这个应用程序时没有问题,因为我只是在我的安装程序项目中包含了所有需要的参考。

当我尝试调试 应用程序时,问题出现了。 bin 文件夹将没有模型程序集,因为它未被引用。

问题
是否有解决这种 "reference of a reference" 情况的最佳做法?

我们提出的解决方案

添加模型作为参考
这感觉不对,我们污染了项目

在解决方案中包含模型项目并添加为项目引用
这感觉更糟(污染溶液)

添加post-构建步骤
可能是一个解决方案,但也感觉不对。

对另一个项目的引用不一定是项目引用。在您的示例中,将 Model 引用为 Framework 中的 Bin 引用。这样,预构建模型将包含在构建框架中。

最好的解决方案是用 NuGet 打包您的 FrameworkLibrary 程序集(或集合)。然后,您可以在 Visual Studio 中使用 NuGet 来处理所有这些引用。这很好用,即使在使用嵌套依赖项时也是如此。

NuGet 得到完全支持并集成到 Visual Studio 中。托管您自己的包存储库非常容易(就像指向包的文件共享一样简单)。

您可以为自己的(内部)包托管一个私有的现场存储库。大多数商店都是这样做的。您可以将其与一个或多个 public NuGet 存储库结合使用,用于 public 事物,如 Log4Net 等。

虽然这似乎需要一些时间才能完成 运行(这是相对的,但请尝试先使用 public 包,以便先掌握使用 NuGet 的窍门),你也会得到很多好处。例如,您可以开箱即用地支持对库进行版本控制。

在我的公司,我们多年来一直遇到这个问题,我们过去常常构建库程序集 (50+) 并将其签入到源代码管理中,然后将其拖到各个分支中。由于我们已经切换到使用 NuGet 的方法,这个问题对我们来说就消失了。再也不会回头看了。