【问题标题】:ClickOnce app built via Jenkins throwing CS1704 - An assembly with the same simple name {whatever} has already been imported通过 Jenkins 抛出 CS1704 构建的 ClickOnce 应用程序 - 已导入具有相同简单名称 {whatever} 的程序集
【发布时间】:2017-05-23 15:02:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: msbuild .net-assembly csc assembly-name


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗨,马丁,感谢您的帮助。我按照指示包含第二行,位于第一行之下。我应该替换原来的 AssemblyName 行吗?
    • 不,您可以保持原样。这个想法是在传递/p:OverrideAssemblyName=AnotherName 时覆盖原始名称
    • 天哪,我在条件中犯了一个错误。我在写完后重命名了该属性并忘记在两个地方都这样做.. 更新帖子
    • 现在说得通了,确实 :-) 似乎工作正常了,我在 jenkins 的工作中留下了一个错误,将解决它并回来奖励您的帮助,非常感谢!
    猜你喜欢
    • 2012-12-09
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多