Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式将AssemblyInfo.cs更新为预生成事件(Visual Studio/msbuild)_C#_Visual Studio_Msbuild_.net Assembly_Assemblyinfo - Fatal编程技术网

C# 如何以编程方式将AssemblyInfo.cs更新为预生成事件(Visual Studio/msbuild)

C# 如何以编程方式将AssemblyInfo.cs更新为预生成事件(Visual Studio/msbuild),c#,visual-studio,msbuild,.net-assembly,assemblyinfo,C#,Visual Studio,Msbuild,.net Assembly,Assemblyinfo,我希望在项目中定义一个位置来存储版本字符串。我正在寻找的行为是,我将版本存储在项目目录中的文本文件(version.txt)中,然后我的预构建事件更新Properties/AssemblyInfo.cs中的内容 [assembly: AssemblyVersion("<Version>")] [assembly: AssemblyFileVersion("<Version>")] 失败的(我认为)是预构建步骤中的调用: 预构建事件命令行: powershell $(Pr

我希望在项目中定义一个位置来存储版本字符串。我正在寻找的行为是,我将版本存储在项目目录中的文本文件(version.txt)中,然后我的预构建事件更新Properties/AssemblyInfo.cs中的内容

[assembly: AssemblyVersion("<Version>")]
[assembly: AssemblyFileVersion("<Version>")]
失败的(我认为)是预构建步骤中的调用:

预构建事件命令行:

powershell $(ProjectDir)set_assembly_version.ps1
我没有尝试使用msbuild运行此功能,只是通过Visual Studio 2017运行。因为AssemblyInfo.cs是一个项目文件,这可能吗

失败的(我认为)是预构建步骤中的调用:

有错误信息吗?当我们在
pre-build event
中设置命令时,它实际上调用
cmd.exe
来执行该命令。所以,您应该确保该脚本在cmd.exe中成功执行,然后可以在预构建事件中使用它

我注意到您在ps脚本中使用了相对路径
Properties\AssemblyInfo.cs
,这可以被msbuild识别,因为在生成此项目时,msbuild知道当前的ProjectDir,因此它知道在哪里可以找到
Properties\AssemblyInfo.cs
。但是,如果cmd.exe不知道当前项目目录,则在执行此脚本时可能会导致错误。请检查这一点

我没有尝试使用msbuild运行此命令,只是通过VisualStudio运行 2017因为AssemblyInfo.cs是一个项目文件,这可能吗

注意:MSbuild是VS的生成引擎。因此,即使在VS中生成C#项目,实际上也在调用MSbuild.exe来生成它们。(对于VS2017)

Msbuild将在CoreComile目标或(其他编译目标?)中编译源文件(包括Assembly.cs文件)。将生成输出日志详细性更改为正常,然后可以看到生成顺序。见此:

PreBuildEvent将在编译目标之前执行,因此这是可能的。然而,在构建过程中,有时VS会占用源文件,所以我不确定您的方法是否能够最终成功。如果有任何错误消息,请随时共享:)


您需要在预构建事件中设置版本的原因是什么,也许您可以使用自动增加版本。对于VS2017,将xx.csproj中的
Deterministic
属性从true更改为false,这样可以在生成过程中自动增加程序集版本。

我试图做同样的事情,但发现我的系统未配置为允许我通过类似的命令执行powershell脚本。我本可以解决这个问题,但我想我应该构建一个完整的预构建命令,而不需要执行外部脚本文件,而不是要求每个人对他们的机器进行相同的编辑。主要的“挑战”是确保我已经正确地逃脱了一切

由于我的项目的性质,我的版本有很多变化。我尝试重新创建您在命令中尝试执行的操作,您应该能够将插件插入到预构建事件中:

powershell $assemblyInfoPath = \"$(projectDir)Properties\AssemblyInfo.cs\";$versionText = (Get-Content -Path \"$(projectDir)version.txt\" -ReadCount 0);$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0);$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyVersion\(".*"\)\]$\", \"[assembly: AssemblyVersion(`\"$versionText`\")]\";$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyFileVersion\(".*"\)\]$\", \"[assembly: AssemblyFileVersion(`\"$versionText`\")]\";Set-Content -Path $assemblyInfoPath -Value $assemblyInfoText;

作为构建的一部分更改源代码不是最好的主意。。。但是你所尝试的应该是有效的。将构建日志级别(选项->构建和运行)设置为详细(或诊断)并仔细阅读日志…这一个适合我
powershell $assemblyInfoPath = \"$(projectDir)Properties\AssemblyInfo.cs\";$versionText = (Get-Content -Path \"$(projectDir)version.txt\" -ReadCount 0);$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0);$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyVersion\(".*"\)\]$\", \"[assembly: AssemblyVersion(`\"$versionText`\")]\";$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyFileVersion\(".*"\)\]$\", \"[assembly: AssemblyFileVersion(`\"$versionText`\")]\";Set-Content -Path $assemblyInfoPath -Value $assemblyInfoText;