C# 是否在运行时或编译时引用所有必需的程序集?

C# 是否在运行时或编译时引用所有必需的程序集?,c#,.net,vb.net,visual-studio,C#,.net,Vb.net,Visual Studio,我以为这个问题已经问过很多次了,但我找不到 我们正在开发应用程序,并且有多个共享程序集供多个目标使用。当我创建一个新的应用程序时,我可能会使用这样的程序集(例如框架)并在我的项目中引用它。这里一切都好。但是,当这个框架程序集使用例如模型程序集时,VisualStudio不会强迫我引用它。只要我的代码不涉及任何模型类型,它就可以在没有引用的情况下正常编译 在运行时,它确实需要模型程序集。当发布该应用程序时,没有问题,因为我只在安装程序项目中包含所有必需的引用 当我尝试调试应用程序时,问题就会出现。

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

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

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

当我尝试调试应用程序时,问题就会出现。bin文件夹将不包含模型部件,因为它未被引用

问题
是否有最佳实践来解决这种“参考的参考”情况

我们提出的解决方案

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

将模型项目包括在解决方案中,并添加为项目参考
这感觉更糟(污染溶液)

添加生成后步骤

可能是一个解决方案,但也不认为是正确的。

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

最好的解决方案是将您的
框架
程序集(或集合)打包。然后,您可以在VisualStudio中使用NuGet来处理所有这些引用。即使在使用嵌套依赖项时,这也非常有效

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

您可以为自己的(内部)包托管一个专用的现场存储库。大多数商店都是这样做的。您可以将其与一个或多个公共NuGet存储库相结合,以存储Log4Net等公共内容

虽然这可能需要一些时间来启动和运行(这是相对的,试着先使用一个公共包,以便掌握先使用NuGet的诀窍),但您也获得了很多好处。例如,您可以获得开箱即用的库版本控制支持


在我的公司,这个问题已经存在多年了,我们过去常常构建库程序集(50+)并将其签入到源代码管理中,然后在各个分支之间拖动它。因为我们已经放弃了使用NuGet的方法,所以这个问题对我们来说就消失了。再也不要回头看了。

你的实际问题是什么?所有标准MSBuild生成任务都能够解析引用并复制所有必需的程序集(不仅是直接引用的程序集)。只需澄清:项目A引用程序集B,该程序集B应引用程序集C,但只要它引用B,您就可以编译A,即使B不引用C?请记住,组件应该是“部署单元”。因此,如果程序集
Framework.dll
始终要求您拥有程序集
Model.dll
,那么您最好将两者作为一个文件程序集。如果<代码>模型。DLL 内部使用“代码>框架。DLL< /COD>,并且没有其他项目,您可以考虑将其合并为<代码>框架。DLL使用.@奥廖尔:同意。(但也有例外。例如P/Invoke DLL函数引用(我想),或者构建工具不太可能检测运行时依赖性,例如当程序集使用反射加载另一个程序集时。)为我的问题添加了一些澄清,希望这会有所帮助。感觉简单的东西需要很多管道,还是我错了?另一件事是它将对每个人公开,对吗?我不确定我想要那个。@TomKuijsten建立自己的私有存储库非常简单。看见我个人已经移动了我所有的“实用程序项目”,以便通过NuGet提供服务,因为版本控制使多个项目引用一个项目变得简单,并且您可以在不破坏其他应用程序的情况下更改程序集。这将是一个很好的解决方案,我来看看。感谢您的回答,我们使用私有nuget存储库启动了一个POC。我真的不明白这对我的情况有什么帮助。如果包含了预构建的模型,我仍然需要在我的新应用程序中硬引用它,以便复制到我的bin文件夹中,对吗?