【问题标题】:Change AssemblyName via MSBuild Target通过 MSBuild 目标更改 AssemblyName
【发布时间】:2018-10-27 02:28:38
【问题描述】:

我正在尝试在我的 Project.csproj 文件中配置 MSBuild 目标。使用以下命令调用名为“Test”的目标:

msbuild.exe /target:Test

但是,我不知道如何更改此目标的 AssemblyName(原始程序集名称为 MyProject)。我的代码如下所示:

<Target Name="Test">
  <PropertyGroup>
    <PublishUrl>D:\PublishLocation\ClickOnce Setup\</PublishUrl>
  </PropertyGroup>
  <MSBuild Projects="$(ProjLocation)\$(ProjectName).csproj" Properties="ProductName=$(ProductName) (Test); AssemblyName=MyProjectTest; PublishUrl=$(PublishUrl)" Targets="Publish" />
  <ItemGroup>
    <SetupFiles Include="$(ProjPublishLocation)\*.*" />
    <UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(SetupFiles)" DestinationFolder="D:\PublishLocation\ClickOnce Setup\" />
  <Copy SourceFiles="@(UpdateFiles)" DestinationFolder="D:\PublishLocation\ClickOnce Setup\Application Files\%(RecursiveDir)" />
</Target>

如果我从代码中删除AssemblyName=MyProjectTest;,它可以正常工作。如果我像上面那样运行它,我会收到以下错误:

“C:\Users\...\MyProject\MyProject.csproj” (测试目标) (1) -> “C:\Users\...\MyProject\MyProject.csproj” (发布目标) (1:2) ->

(CoreCompile 目标)->
Models\SessionModel.cs(207,51):错误 CS1528:预期;或 = (不能 在声明中指定构造函数参数)[ C:\Users\...\MyProject\MyProject.csproj]

(……还有很多,差不多一样)

更新

我在构建输出中发现了更多,也许更有趣的警告:

“C:\Users\...\MyProject\MyProject.csproj” (快速目标)(1)-> “C:\Users\...\MyProject.csproj” (发布目标)(1:2)->(ResolveAssemblyReferences 目标)->
C:\程序文件 (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): 警告 MSB3277: 发现不同版本的冲突 无法解析的相同依赖程序集。这些参考 当日志详细程度设置为时,冲突会在构建日志中重新列出 详细的。 [C:\Users\...\MyProject\MyProject.csproj]

值得一提的是,我在发布位置发布了旧版本,其中程序集名称没有更改。这会导致我看到的冲突吗...?

【问题讨论】:

    标签: c# visual-studio msbuild


    【解决方案1】:

    通过 MSBuild 目标更改 AssemblyName

    根据您的Test 目标和another post,我创建了一个示例应用程序来使用以下脚本和MSBuild 命令行msbuild.exe /target:Test 测试此问题:

      <PropertyGroup>
        <ProjLocation>$(ProjectDir)</ProjLocation>
        <ProjLocationReleaseDir>$(ProjLocation)\bin\Debug</ProjLocationReleaseDir>
        <ProjPublishLocation>$(ProjLocationReleaseDir)\app.publish</ProjPublishLocation>
        <DeploymentFolder>D:\PublishFolder\Test\</DeploymentFolder>
      </PropertyGroup>
    
      <Target Name="Test" DependsOnTargets="Clean">
        <MSBuild Projects="$(ProjLocation)\$(ProjectName).csproj" Properties="ProductName=$(ProductName) (Test); AssemblyName=MyProjectTest; PublishUrl=$(PublishUrl)" Targets="Publish" />
    
        <ItemGroup>
          <SetupFiles Include="$(ProjPublishLocation)\*.*" />
          <UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*" />
        </ItemGroup>
        <Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\Public Test\" />
        <Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Public Test\Application Files\%(RecursiveDir)" />
      </Target>
    

    它可以正常工作,没有任何问题,并且程序集名称也已更改:

    所以这个问题应该与SessionModel.cs文件和warning MSB3277中的错误CS1528有关。要解决 CS1528 错误,您可以查看文档 Compiler Error CS1528 了解更多详细信息。

    对于warning MSB3277,您可以将“MSBuild 项目构建输出详细程度”更改为“详细”以检查引用冲突并解决此冲突。详情请见this thread

    希望这会有所帮助。

    【讨论】:

    • 您好,感谢您的意见。我对所有报告的错误感到非常困惑,例如SessionModel.cs,因为应用程序构建良好,当我通过 Visual Studio“正常”构建它时。这似乎只是一个 ClickOnce 问题......
    • @Noceo,是的,你也可以新建一个空白项目来测试这个问题。但是由于我无法重现这两个错误,所以我无法直接回答这个问题。或者您可以提供一个示例来重现示例或步骤,然后我会继续关注它。
    • 虽然您可能无法确切地告诉我问题出在哪里,但您确实告诉我,问题不是。所以你一直很有帮助:-)。我仍然坚持到底是什么导致了问题,但如果我发现一些重要的东西,我会更新我的问题。
    【解决方案2】:

    原来的问题是,我在我的项目中包含了System.net.http.dll 作为一个文件。这被设置为 Content 作为构建操作。当我将其更改为 嵌入式资源 时,它开始工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多