c# - 从 IDE 构建时部署 .NET 应用程序的正确方法是什么
问题描述
我有一个包含 2 个项目的解决方案:一个名为的类库plugin
和一个名为myconsole
. 他们都使用 NuGet 包,即log4net
. 他们必须满足以下要求:
myconsole
不允许引用plugin.dll
,但需要在运行时通过反射加载plugin.dll
plugins
必须在相对于的目录中可用myconsole.exe
log4net.dll
必须在一个名为的目录中可用,该目录dlls
也相对于myconsole.exe
当我在 IDE 中构建解决方案时,我需要进行此部署。理想情况下,我需要由 IDE 构建生成此文件结构:
[Z:\Staging]
- [Dlls]
- log4net.dll
- [Plugins]
- plugin.dll
- myconsole.exe
我正在考虑更新每个项目并添加一个在构建之后运行的 MSBuild 目标,以将输出目录 ( bin\debug
) 的内容复制到我需要的目标目录。这种方法存在一些问题:
- 如果我需要添加更多具有不同部署要求的项目,它就不能很好地扩展。
- 如果项目是并行构建的,那么它们都需要复制
log4net.dll
到同一位置。如果这种情况同时发生,那么我会收到警告,因为该文件正在使用中并尝试重试。它最终会起作用,但我认为这是我做错了什么的暗示。要解决此问题,我可以过滤项目输出以仅部署项目生成的内容 - 这意味着我只能部署myconsole.exe
andplugin.dll
,但不能部署log4net.dll
. 我必须手动部署这个,可能在完成两个项目之后(解决方案级事件?)。这似乎太复杂了......
在 MSBuild 中实现这一点的正确方法是什么?
解决方案
在我看来,你问了几个问题:
- 如何将引用输出到单独的文件夹。
- 如何在
dll
没有引用的情况下导出 a。
如何将引用输出到单独的文件夹
这个问题已经被问过了,而且它的答案有些复杂,所以不值得重复。
如何在dll
没有引用的情况下导出 a
您不想plugin.dll
使用它自己的log4net.dll
,因为如果 中有静态字段log4net.dll
,它将plugin.dll
在运行时加载时重新初始化。
因此,尽管您将 s 导出plugin.dll
到单独的文件夹,但您需要将dll
s 保留在可执行文件夹中:
将此添加到您的plugin.csproj
文件中:
<Target Name="DontCopyReferencesToLocal" AfterTargets="ResolveAssemblyReferences">
<ItemGroup>
<ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" />
</ItemGroup>
</Target>
免责声明:
我还没有检查这两个要求的组合是如何一起工作的。但我认为,只要它们各自独立工作,就没有理由不一起工作。
推荐阅读
- azure-functions - 覆盖 Azure Functions 的日志级别
- c++ - 尝试从输入中获取字符串时出现分段错误
- sql - 如何使用 group by 获取唯一记录?
- apache-spark - 在 Spark Dataset mapGroups 操作甚至在函数中返回一个字符串之后,值类型是二进制的
- javascript - 有没有办法将其他html文档中的html表单保存为表格?
- uwp-xaml - UWP 边框控制的默认样式
- sql - SQL 为特定日期范围内插缺失值 - 在某些条件下
- java - 在没有设置器Java的子类中将值设置为私有超类变量
- apache-spark - Apache Spark SQL:COALESCE NULL 数组转换为空结构数组
- python - Databricks:如何从 R Dataframe 切换到 Pandas Dataframe(R 到 python 在同一个笔记本中)