无需二进制引用即可自动复制相关的DLL

时间:2017-01-22 23:08:26

标签: c# dll visual-studio-2015

Visual Studio 2015,C#控制台项目+ C#库项目:

有没有办法在不使用Project引用(和Copy local = True)的情况下自动将相关项目二进制输出复制到特定“master”项目的输出目录?

我希望能够在没有实际二进制引用的情况下保持exe-s和dll-s松散耦合,但可以依赖相关的dll-s总是复制到正确的输出目录(例如Debug / Release)。

示例:

  • 主项目:名为“Console”的控制台项目
  • 相关项目:名为“Library”的图书馆项目
  • 没有必要(也没有意愿)创建二进制文件 从Console到Library的引用,但我们知道我们需要 当前目录中的库DLL在启动时解析依赖关系 注入容器组件(在EXE应用程序中)。
  • 我们希望在本地计算机上自动化构建过程。
  • 我们希望从另一个“主”项目(例如WPF GUI项目)轻松添加这种“引用”,因此“项目依赖项+构建事件”方法不够灵活。

2 个答案:

答案 0 :(得分:1)

我仅在VS2017上验证了此解决方案,但根据引用的MSDn文章的日期,它应与VS2015一起使用:使用ReferenceOutputAssembly是您的csproj。 遗憾的是,该属性只能通过手动编辑csproj来添加。

<ProjectReference Include="..\..\Calfitec\PglLibPAC\PglOdpm\PglOdpm.csproj">
  <Project>{261de855-9e8f-45de-b57d-fd4c7deb5f1b}</Project>
  <Name>PglOdpm</Name>
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>

另请参阅:How to have a Project Reference without referencing the actual binary

这是该功能的预期用途:

  

有时候,您希望从项目B到项目A的项目引用来指示生成时依赖关系,但实际上并不想让程序集B引用程序集A(可能是因为它是仅运行时的依赖关系,或者是使用反射加载的)

答案 1 :(得分:0)

<强> TL; DR; Copy local甚至出现的事实告诉我,Console具有直接的Add Reference依赖性,这有点违背了DI的目的。只需让Visual Studio通过Copy Local=true执行此操作。

如果:

  1. 控制台图书馆
  2. 添加参考
  3. 控制台期望图书馆在运行时显示在与控制台相同的文件夹中
  4. 在您的解决方案中包含大量项目
  5. ...那么你应该让Visual Studio 通过Copy Local = true做事,因为Console有一个必须解决的直接依赖,而依赖注入(DI)甚至没有进入等式。如果您有大量项目,如果副本在结束时发生一次但是您没有表明这是您的方案,则可以显示它可以大大加快构建速度。

    但是:

    1. 目的是使用依赖注入
    2. 控制台 添加对库的引用
    3. 中的类将通过DI
    4. 动态创建
    5. 可选择部署到与Console不同的文件夹中,可能是一个名为Plugins或DI的文件夹
    6. ...然后,在其中一个项目中将 Post Build 步骤复制到单个目标文件夹中,可以更轻松地将相关DLL复制一次。在为大型解决方案开发插件/ DI时尤其如此。

      请参阅&lt; 项目&gt;。 Properties.Build Events.Post-build事件命令行

      DI?

      听起来你想要使用DI,但Copy Local=true的出现告诉我你的程序与图书馆有直接关系。 DI有什么意义?你的已经强烈耦合了。