首页 > 解决方案 > 从 IDE 构建时部署 .NET 应用程序的正确方法是什么

问题描述

我有一个包含 2 个项目的解决方案:一个名为的类库plugin和一个名为myconsole. 他们都使用 NuGet 包,即log4net. 他们必须满足以下要求:

当我在 IDE 中构建解决方案时,我需要进行此部署。理想情况下,我需要由 IDE 构建生成此文件结构:

[Z:\Staging]
- [Dlls]
  - log4net.dll
- [Plugins]
  - plugin.dll
- myconsole.exe

我正在考虑更新每个项目并添加一个在构建之后运行的 MSBuild 目标,以将输出目录 ( bin\debug) 的内容复制到我需要的目标目录。这种方法存在一些问题:

  1. 如果我需要添加更多具有不同部署要求的项目,它就不能很好地扩展。
  2. 如果项目是并行构建的,那么它们都需要复制log4net.dll到同一位置。如果这种情况同时发生,那么我会收到警告,因为该文件正在使用中并尝试重试。它最终会起作用,但我认为这是我做错了什么的暗示。要解决此问题,我可以过滤项目输出以仅部署项目生成的内容 - 这意味着我只能部署myconsole.exeand plugin.dll,但不能部署log4net.dll. 我必须手动部署这个,可能在完成两个项目之后(解决方案级事件?)。这似乎太复杂了......

在 MSBuild 中实现这一点的正确方法是什么?

标签: c#.netmsbuild

解决方案


在我看来,你问了几个问题:

  • 如何将引用输出到单独的文件夹。
  • 如何在dll没有引用的情况下导出 a。

如何将引用输出到单独的文件夹

这个问题已经被过了,而且它的答案有些复杂,所以不值得重复。

如何在dll没有引用的情况下导出 a

您不想plugin.dll使用它自己的log4net.dll,因为如果 中有静态字段log4net.dll,它将plugin.dll在运行时加载时重新初始化。

因此,尽管您将 s 导出plugin.dll到单独的文件夹,但您需要将dlls 保留在可执行文件夹中:

将此添加到您的plugin.csproj文件中:

<Target Name="DontCopyReferencesToLocal" AfterTargets="ResolveAssemblyReferences">
  <ItemGroup>
    <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" />
  </ItemGroup>
</Target>

免责声明:

我还没有检查这两个要求的组合是如何一起工作的。但我认为,只要它们各自独立工作,就没有理由不一起工作。


推荐阅读