通过 Jenkins 构建的 ClickOnce 应用程序抛出 CS1704 - 已导入具有相同简单名称 {whatever} 的程序集

ClickOnce app built via Jenkins throwing CS1704 - An assembly with the same simple name {whatever} has already been imported

我有一个 winforms 应用程序,它是通过单击一次发布来部署的。 假设我的测试是正确的,在同一台机器上多次安装同一个应用程序的唯一方法是为不同的程序集名称进行每次发布。

我的问题是我是 运行 通过 jenkins 的 msbuild,为了完成上述任务,我会添加 /p:AssemblyName={whatever},这会将构建生成的所有程序集重命名为同样的 {whatever} 值。如果我构建的输出是 1 个 exe 和 5 个 dll,所有 6 个文件将被命名为 {whatever}。

这又会引发 CS1704:已导入具有相同简单名称 {whatever} 的程序集。

唯一的出路是执行 msbuild 生成的所有 csc.exe 调用,我自己,看看我是否可以为每个项目设置不同的程序集名称?

或者有其他方法可以解决这个问题吗?

这里的问题是,作为命令行参数传递给 MSBuild 的每个 属性 都被视为全局 属性,并且将覆盖在该调用中构建的所有项目上的 属性。解决方案是引入一个只有 "main" 项目消耗的中间体 属性。

编辑应用程序的 csproj 文件以包含此文件(在 AssemblyName 已定义的地方 - 假设此处 WindowsFormsApp1 是应用程序的名称):

<AssemblyName>WindowsFormsApp1</AssemblyName>
<AssemblyName Condition="'$(OverrideAssemblyName)' != ''">$(OverrideAssemblyName)</AssemblyName>

然后您可以使用 /p:OverrideAssemblyName=AnotherName 的 msbuild 命令,而不会在引用的库上创建冲突的程序集名称。 属性 仍然是全局定义的,但只有一个项目使用它。