为运行时或编译时引用所有必需的程序集?
Reference all required assemblies for runtime or compile time?
我以为这个问题已经被问过很多次了,但我找不到。
我们正在开发应用程序,并且有多个共享程序集供多个目标使用。当我创建一个新的应用程序时,我可能会使用这样的程序集(例如框架)并在我的项目中引用它。这里一切都很好。但是,当此框架程序集使用例如模型程序集时,Visual Studio 并没有强迫我引用它。只要我的代码不涉及任何模型类型,它就可以在没有引用的情况下正常编译。
在运行时,它确实需要模型程序集。当发布这个应用程序时没有问题,因为我只是在我的安装程序项目中包含了所有需要的参考。
当我尝试调试 应用程序时,问题出现了。 bin 文件夹将没有模型程序集,因为它未被引用。
问题
是否有解决这种 "reference of a reference" 情况的最佳做法?
我们提出的解决方案
添加模型作为参考
这感觉不对,我们污染了项目
在解决方案中包含模型项目并添加为项目引用
这感觉更糟(污染溶液)
添加post-构建步骤
可能是一个解决方案,但也感觉不对。
对另一个项目的引用不一定是项目引用。在您的示例中,将 Model 引用为 Framework 中的 Bin 引用。这样,预构建模型将包含在构建框架中。
最好的解决方案是用 NuGet 打包您的 Framework
或 Library
程序集(或集合)。然后,您可以在 Visual Studio 中使用 NuGet 来处理所有这些引用。这很好用,即使在使用嵌套依赖项时也是如此。
NuGet 得到完全支持并集成到 Visual Studio 中。托管您自己的包存储库非常容易(就像指向包的文件共享一样简单)。
您可以为自己的(内部)包托管一个私有的现场存储库。大多数商店都是这样做的。您可以将其与一个或多个 public NuGet 存储库结合使用,用于 public 事物,如 Log4Net 等。
虽然这似乎需要一些时间才能完成 运行(这是相对的,但请尝试先使用 public 包,以便先掌握使用 NuGet 的窍门),你也会得到很多好处。例如,您可以开箱即用地支持对库进行版本控制。
在我的公司,我们多年来一直遇到这个问题,我们过去常常构建库程序集 (50+) 并将其签入到源代码管理中,然后将其拖到各个分支中。由于我们已经切换到使用 NuGet 的方法,这个问题对我们来说就消失了。再也不会回头看了。
我以为这个问题已经被问过很多次了,但我找不到。
我们正在开发应用程序,并且有多个共享程序集供多个目标使用。当我创建一个新的应用程序时,我可能会使用这样的程序集(例如框架)并在我的项目中引用它。这里一切都很好。但是,当此框架程序集使用例如模型程序集时,Visual Studio 并没有强迫我引用它。只要我的代码不涉及任何模型类型,它就可以在没有引用的情况下正常编译。
在运行时,它确实需要模型程序集。当发布这个应用程序时没有问题,因为我只是在我的安装程序项目中包含了所有需要的参考。
当我尝试调试 应用程序时,问题出现了。 bin 文件夹将没有模型程序集,因为它未被引用。
问题
是否有解决这种 "reference of a reference" 情况的最佳做法?
我们提出的解决方案
添加模型作为参考
这感觉不对,我们污染了项目
在解决方案中包含模型项目并添加为项目引用
这感觉更糟(污染溶液)
添加post-构建步骤
可能是一个解决方案,但也感觉不对。
对另一个项目的引用不一定是项目引用。在您的示例中,将 Model 引用为 Framework 中的 Bin 引用。这样,预构建模型将包含在构建框架中。
最好的解决方案是用 NuGet 打包您的 Framework
或 Library
程序集(或集合)。然后,您可以在 Visual Studio 中使用 NuGet 来处理所有这些引用。这很好用,即使在使用嵌套依赖项时也是如此。
NuGet 得到完全支持并集成到 Visual Studio 中。托管您自己的包存储库非常容易(就像指向包的文件共享一样简单)。
您可以为自己的(内部)包托管一个私有的现场存储库。大多数商店都是这样做的。您可以将其与一个或多个 public NuGet 存储库结合使用,用于 public 事物,如 Log4Net 等。
虽然这似乎需要一些时间才能完成 运行(这是相对的,但请尝试先使用 public 包,以便先掌握使用 NuGet 的窍门),你也会得到很多好处。例如,您可以开箱即用地支持对库进行版本控制。
在我的公司,我们多年来一直遇到这个问题,我们过去常常构建库程序集 (50+) 并将其签入到源代码管理中,然后将其拖到各个分支中。由于我们已经切换到使用 NuGet 的方法,这个问题对我们来说就消失了。再也不会回头看了。