多种方式获取SVN的版本号并写入到AssemblyInfo.cs中
获取SVN的版本号并写入到AssemblyInfo.cs中
在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本。项目版本一般由主版本、次版本、内部版本、修改版本四个部分组成,我们获取的SVN版本就作为修改版本即可。这里需要利用SVN的SubWCRev.exe来实现,一般安装了SVN后都会有的。SubWCRev.exe获取SVN版本并依据模板文件,更新到相应的目标文件中。下面是具体的步骤。
1.将项目中Properties中的AssemblyInfo.cs文件复制一份,命名为AssemblyInfo.template.cs,同时将该文件的编译属性设置为无。设置为无是为了不让该文件不参与编译。
同时将[assembly: AssemblyVersion("1.0.0.538")]和[assembly: AssemblyFileVersion("1.0.0.538")]修改为[assembly: AssemblyVersion("1.0.0.$WCREV$")]和[assembly: AssemblyFileVersion("1.0.0.$WCREV$")],如下图
其中$WCREV$是SubWCRev.exe用来匹配然后替换成最新版本号的,必须要这个名字。
2.在项目属性的生成事件中,添加预先生成事件命令,命令内容为SubWCRev $(SolutionDir) $(ProjectDir)Properties\AssemblyInfo.template.cs $(ProjectDir)Properties\AssemblyInfo.cs,如下图
3.编译生成后,可以看到AssemblyInfo.cs中的版本号已经变了,如下图
4.代码中取得该版本号并显示,代码如下
this.Text += String.Format("({0})", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
结果如下图所示
转载请注明出处
出处:https://blog.csdn.net/xxdddail/article/details/49280375
=======================================================================================
获取SVN版本号记录项目版本号
VS中的Properties下的AssemblyInfo.cs可以设置相应的版本号。下面是AssemblyInfo.cs设置版本号的方式。
[assembly: AssemblyFileVersion("1.0.0.0")]
但是,这个需要每次都设定,而且与SVN上的版本号并不一致,追塑起来不是很方便。所以就想着取SVN上的版本号作为项目的版本号。要得到SVN的版本号,可以在SVN的节眯下,通过SVN的命令svn info来获得信息。这通过CMD命令很容易可以达到,不过,我希望在VS编译时,每次都去获取,所以选择了在VS预生成事件命令中去执行。看下图预生成事件命令行中输入相应的CMD命令。
1.svn info>svn_info.txt 是执行SVN命令,获取相应的版本信息,然后存到svn_info.txt的文件中。
2.findstr "Revision" svn_info.txt>..\svn_version.dll 从svn_info.txt中查找出版本号,并存到svn_version.dll中。
3.del svn_info.txt 删除svn_info.txt文件。
在编译时将会生成svn_version.dll,需要将该文件添加到项目中,以便能同时发布。这里取名为svn_version.dll,可以改成其他的名字和后缀名。
这样在项目启动时,可以通过读取svn_version.dll中的内容来获取SVN版本号。
String version = "1.1.1" String serverPhysicalPath = Server.MapPath(".");//WEB上,需要将服务路径转换成本地路径。如果是WinForm程序,可以获取程序路径。 if (!serverPhysicalPath.EndsWith("\\")) { serverPhysicalPath += "\\"; } String svnVersionPath = serverPhysicalPath + "svn_version.dll"; StreamReader svnSteamReader = new StreamReader(svnVersionPath); String line = svnSteamReader.ReadLine(); if (!String.IsNullOrWhiteSpace(line)) { String[] temps = line.Split(':'); if (temps.Length > 1) { version += String.Format(".{0}", temps[1]); } } return version;
出处:https://blog.csdn.net/xxdddail/article/details/38433759
=======================================================================================
在VS项目中使用SVN版本号作为编译版本号
在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分。版本号的规则也有许多种,在此不讨论具体的编码规范。对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时,清楚的标识组件与代码的对应关系十分重要。
本文主要说明如何在 .Net 项目使用 SVN 作为版本控制工具时生成与代码对应的组件版本号。
我们知道,SVN 在 commit 时会生成一串数字作为序号,所以基本思路是把这个序号作为 . Net 项目编译后生成dll的文件版本号的最后一段。下面所列方法需要使用到TortoiseSVN 提供的 SubWCRev.exe 。
首先,我们需要通过注册表查找 TortoiseSVN 的安装目录。
1 Rem Search TSVN Path 2 For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do ( 3 ECHO %%i | Find "Directory">NUL 4 IF %ERRORLEVEL% == 0 (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%1)) 5 ) 6 SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe
SubWCRev 是通过替换文件中指定的关键字来实现获得 commit 序号的,点击查看详细的列表。
然后我们建立以一个 AssemblyInfo.tp 作为替换使用的模板,由于 AssemblyInfo.cs 中除了固定的值外还有类似 GUID 变化的值,所以我们不能全部替换,因此仅将需要修改的部分放在 tp 文件中,其他内容还是放到cs文件中,AssemblyInfo.tp内容如下:
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
接下来使用批处理替换原来的 AssemblyInfo.cs 文件,为了在每次编译时都自动替换,我们把调用批处理的命令写在项目生成事件的生成前事件中,例如下面这样:
"(TargetDir)BeforeBuildProject.bat" "(ProjectDir)" "$(TargetDir)AssemblyInfo.tp" .\Properties\AssemblyInfo.cs
$(TargetDir)表示编译输出目录,更多可用全局变量请在生成事件中点击“宏”查看。
替换 AssemblyInfo.cs 的批处理BeforeBuildProject.bat文件代码:
1 SET WorkDir=%1 2 SET Template=%2 3 SET target=%3 4 SET AssemblyInfo=ASSEMBLY_INFO.tmp 5 6 PushD %WorkDir% 7 SET WorkDir=.\ 8 9 Rem Generate a template file 10 FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo% 11 FindStr ".*" %Template% >> %AssemblyInfo% 12 13 Rem Using TSVN Replace Tlp 14 "%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL
FindStr /v 表示在%target%文件中,查找字符串"AssemblyVersion AssemblyFileVersion"不匹配的行,写入到%AssemblyInfo%指定的文件中;
FindStr ".*" 是查找所有内容;
具体自行查看FindStr的帮助说明。
当然这样还不是一劳永逸,你会发现每次编译 AssemblyInfo.cs 文件都会变化,因此你的 commit 序号也会一直跟着增加,这并不是我们所想要的效果。这里提出一种解决方案,在每次替换后生成 dll 后又将 AssemblyInfo.cs 还原回去。
为此,我们在生成前事件中增加备份命令:
COPY /y "%target%" "%target%.bak">NUL
然后增加生成后事件,调用命令为:
"(TargetDir)AfterBuildProject.bat" "(ProjectDir)Properties\AssemblyInfo.cs"
在 AfterBuildProject.bat 中我们需要完成还原 AssemblyInfo.cs 和删除备份文件的工作,代码如下:
1 SET target=%1 2 COPY "%target%.bak" %target% 3 DEL /Q "%target%.bak" 2>NUL
就此,每次编译时,系统都会自动将 commit 序号放到 dll 的文件版本中了。
本文来自 NewIdea 的博客,作者 Carey Tzou 。
原文地址:http://www.cnblogs.com/NewIdea/p/AutoVersion.html
转载请注明出处,否则拒绝转载!
=======================================================================================
在VS项目中使用SVN版本号作为编译版本号
1、复制版本号文件 AssemblyInfo.cs 2、把复制后的文件改名为 AssemblyInfo.templet.cs 修改内容: [assembly: AssemblyVersion("1.0.0.$WCREV$")] 3、工程右键->属性->生成事件->预生成事件命令行 输入以下代码: "C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" $(ProjectDir) $(ProjectDir)Properties\AssemblyInfo.templet.cs $(ProjectDir)Properties\AssemblyInfo.cs -f
1,svn的工具可获取版本号并更新到项目文件
如果提供了源文件和目的文件,SubWCRev 会复制源文件到目标文件,执行如下所属的关键字替换:
表 5.1. 列出可用的命令行开关
关键字 | 描述 |
---|---|
$WCREV$ | 用工作副本中最高的提交版本来替换 |
$WCDATE$ | 用最高提交版本的日期/时间替换。默认使用国际化格式:yyyy-mm-dd hh:mm:ss 。作为选择,你可以指定strftime() 使用自定义格式,例如:$WCDATE=%a %b %d %I:%M:%S %p$ 。格式字符的列表参见在线引用。 |
$WCNOW$ | Replaced with the current system date/time. This can be used to indicate the build time. Time formatting can be used as described for$WCDATE$ . |
$WCRANGE$ | 在工作目录用更新版本范围替换。如果工作目录处于一致的状态,它是一个单一版本。如果工作目录包含混合版本,或者是过时,或者是故意更新到版本,那么这个范围会用象100:200这样的格式来显示。 |
$WCMIXED$ | 当有混合版本时用TText 替换$WCMIXED?TText:FText$ ,否则用FText 替换。 |
$WCMODS$ | 若本地存在修改,就用TText 替换$WCMODS?TText:FText$ ,否则用FText 替换。 |
$WCURL$ | 用传递给SubWCRev的工作目录的版本库地址替换。 |
$WCINSVN$ | $WCINSVN?TText:FText$ is replaced withTText if the entry is versioned, orFText if not. |
$WCNEEDSLOCK$ | $WCNEEDSLOCK?TText:FText$ is replaced withTText if the entry has thesvn:needs-lock property set, orFText if not. |
$WCISLOCKED$ | $WCISLOCKED?TText:FText$ is replaced withTText if the entry is locked, orFText if not. |
$WCLOCKDATE$ | Replaced with the lock date. Time formatting can be used as described for$WCDATE$ . |
$WCLOCKOWNER$ | Replaced with the name of the lock owner. |
$WCLOCKCOMMENT$ | Replaced with the comment of the lock. |
SubWCRev.exe从命令行或脚本中运行,使用命令行参数控制。
SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]
WorkingCopyPath
是要检查的工作副本路径,你可以只对工作副本使用SubWCRev,而不是直接对版本库,这个路径可以是绝对路径,也可以是工作目录的相对路径。
如果你想让SubWCRev执行关键字替换,象版本库版本,地址等字段保存到文本文件,就需要提供一个模版文件SrcVersionFile
,输出文件DstVersionFile
就是模版替换之后的版本。
有几个开关影响 SubWCRev工作。如果使用多个,必须用单个组指定,例如要用-nm
,不能用-n -m
。
表 5.2. 列出可用的命令行开关
切换 | 描述 |
---|---|
-n | If this switch is given, SubWCRev will exit withERRORLEVEL 7 if the working copy contains local modifications. This may be used to prevent building with uncommitted changes present. |
-m | If this switch is given, SubWCRev will exit withERRORLEVEL 8 if the working copy contains mixed revisions. This may be used to prevent building with a partially updated working copy. |
-d | If this switch is given, SubWCRev will exit withERRORLEVEL 9 if the destination file already exists. |
-f | 如果给出这个开关,SubWCRev 就会包含文件夹的最后修改版本。默认行为是取得版本号时只考虑文件。 |
-e | If this switch is given, SubWCRev will examine directories which are included withsvn:externals , but only if they are from the same repository. The default behaviour is to ignore externals. |
-x | If this switch is given, SubWCRev will output the revision numbers in HEX. |
-X | If this switch is given, SubWCRev will output the revision numbers in HEX, with '0X' prepended. |
参考这个文档http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev.html
出处:https://www.cnblogs.com/zouhao/p/3446951.html
=======================================================================================
个人项目中的应用
根据上面文章的参考,我们可以根据任何逻辑生成版本号了,在程序编译之前,也就是在VS程序的生成事件中,在编译之前把版本逻辑的信息写到AssemblyInfo文件,然后再编译,其实也就是分两步:
1)调用外部命令(可以是bat或者exe等),生成版本号。
2)把版本号更新到AssemblyInfo文件中
那么你可以根据任何规则生成版本号了。
---------------------------------------------------------------------------------------
再提供几个其他方式实现版本号的思路吧:
将增量(DateTime)信息添加到AssemblyFileVersion属性中,该属性具有不破坏任何依赖性的优点。
你可以结合使用预生成事件生成文件,添加该文件(包括其版本属性)然后使用一种方法来读出那些价值再次。
那是在项目的预生成,事件中:
echo [assembly:System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%%date:~8,2%.%time:~0,2%%time:~3,2%.%time:~6,2%")] > $(ProjectDir)Properties\FileVersionInfo.cs
将生成的FileVersionInfo.cs文件(Properties子文件夹)包含到项目中.
注意:
1)写入的文件路径有空格的时候,建议使用双引号
2)写入的文件名可以自己指定,最好和功能相对应
3)版本号的最大值是65535,所以使用AssemblyFileVersion不受这个限制。
缺点:
1)需要写入单独的文件(如:FileVersionInfo.cs)
2)需要修改 AssemblyInfo.cs 文件中的 [assembly: AssemblyFileVersion("1.0.0.0")]注释掉,不能使用
所有经过优化可以如下代码:
set t=%time: =0% echo [assembly: System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%t:~0,2%%t:~3,2%%t:~6,2%")] > "$(ProjectDir)Properties\FileVersionInfo.cs"
优化,可以把脚本单独放到一个FileVersion.bat文件中,这样方便调用
@echo off set verFile="FileVersionInfo.cs" if "%1"=="create" goto :create if "%1"=="delete" goto :delete goto :eof :create echo aaa set t=%time: =0% echo [assembly: System.Reflection.AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%t:~0,2%%t:~3,2%%t:~6,2%")] > %verFile% goto :eof :delete del %verFile%
再次优化,不需要单独的版本号文件,可以和AssemblyInfo.cs文件合并在一起。
保存为单独的bat文件,并且需要把bat文件和AssemblyInfo.cs文件保存在相同的文件夹下
版本一
rem 需要读取和替换的文件如果有中文,需要保存为ANSI格式 @echo off setlocal enabledelayedexpansion cls set fileName=AssemblyInfo.cs set strOld= set t=%time: =0% set strNew=[assembly: AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%t:~0,2%%t:~3,2%%t:~6,2%")] rem 查找并匹配最后一行,包含king的字符串 for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyFileVersion" %fileName%') do (set "strOld=%%a") rem 再次查找完全陪陪的行,并替换queen的字符串 for /f "eol=* tokens=*" %%b in ('type %fileName%') do ( set "str=%%b" if "!str!"=="%strOld%" (set "str=%strNew%") echo !str!>>$) move $ %fileName% goto :eof
版本二
优化:直接把 AssemblyInfo.cs 作为参数传给这个bat批处理文件就可以了,并且bat文件可以保持任意位置
rem 需要读取和替换的文件如果有中文,建议保存为ANSI格式,当前已支持utf-8文件格式 @echo off chcp 65001 setlocal enabledelayedexpansion cls set filePath="%1" SET filePath="%filePath:"=%" if %filePath%=="" (echo parameter is null&goto :eof) set strOld= set t=%time: =0% set strNew=[assembly: AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%t:~0,2%%t:~3,2%%t:~6,2%")] rem 查找并匹配最后一行,包含king的字符串 for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyFileVersion" %filePath%') do (set "strOld=%%a") rem 再次查找完全陪陪的行,并替换queen的字符串 for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filePath%') do ( set "str=%%b" if "!str!"=="%strOld%" if not "!str!"=="" (set "str=%strNew%") echo.!str!>>$) move $ %filePath% goto :eof
版本三
优化:调整生成的格式为:[assembly: AssemblyFileVersion("2020.11.24.25775")]//2020-11-24 14:19:11.12
其中版本号:年.月.日.0点到当前的总秒数除以2
rem 需要读取和替换的文件如果有中文,需要保存为ANSI格式 @echo off chcp 65001 setlocal enabledelayedexpansion cls set filePath="%1" SET filePath="%filePath:"=%" if %filePath%=="" (echo parameter is null&goto :eof) set strOld= set t=%time: =0% set /a TotalSeconds=1%t:~0,2% %% 100 * 3600 + 1%t:~3,2% %% 100 * 60 + 1%t:~6,2% %% 100 set /a TotalSeconds=%TotalSeconds%/2 set strNew=[assembly: AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%TotalSeconds%")]//%date:~0,4%-%date:~5,2%-%date:~8,2% %t% rem 查找并匹配最后一行,包含"[assembly: AssemblyFileVersion"的字符串 for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyFileVersion" %filePath%') do (set "strOld=%%a") rem 再次查找完全匹配的行,并替换strOld的字符串 for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filePath%') do ( set "str=%%b" if "!str!"=="%strOld%" if not "!str!"=="" (set "str=%strNew%") echo.!str!>>$) move $ %filePath% goto :eof
版本四
优化:支持[assembly: AssemblyVersion("2020.11.24.25775")]//2020-11-24 14:19:11.12
rem 需要读取和替换的文件如果有中文,需要保存为ANSI格式 @echo off chcp 65001 setlocal enabledelayedexpansion cls set filePath="%1" SET filePath="%filePath:"=%" if %filePath%=="" (echo parameter is null&goto :eof) set oldAssemblyVersion= set oldAssemblyFileVersion= set t=%time: =0% set /a TotalSeconds=1%t:~0,2% %% 100 * 3600 + 1%t:~3,2% %% 100 * 60 + 1%t:~6,2% %% 100 set /a TotalSeconds=%TotalSeconds%/2 set newAssemblyVersion=[assembly: AssemblyVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%TotalSeconds%")]//%date:~0,4%-%date:~5,2%-%date:~8,2% %t% set newAssemblyFileVersion=[assembly: AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%TotalSeconds%")]//%date:~0,4%-%date:~5,2%-%date:~8,2% %t% rem 查找并匹配最后一行,包含"[assembly: AssemblyVersion"和"[assembly: AssemblyFileVersion"的字符串 for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyVersion" %filePath%') do (set "oldAssemblyVersion=%%a") for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyFileVersion" %filePath%') do (set "oldAssemblyFileVersion=%%a") rem 读取所有行,并替换AssemblyVersion的字符串 if not "%oldAssemblyVersion%"=="" ( for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filePath%') do ( set "str=%%b" & if "!str!"=="%oldAssemblyVersion%" (set "str=%newAssemblyVersion%") echo.!str!>>$) move $ %filePath%) rem 读取所有行,并替换AssemblyFileVersion的字符串 if not "%oldAssemblyFileVersion%"=="" ( for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filePath%') do ( set "str=%%b" & if "!str!"=="%oldAssemblyFileVersion%" (set "str=%newAssemblyFileVersion%") echo.!str!>>$) move $ %filePath%) goto :eof
版本五
优化:增加“使用说明”
rem 需要读取和替换的文件如果有中文,需要保存为ANSI格式 @echo off chcp 65001 setlocal enabledelayedexpansion cls echo;=======================【使用说明】======================= echo;1)对需要读取和替换的文件,如:AssemblyInfo.cs echo; 如有中文,需要保存为ANSI格式。 echo; echo;2)在项目属性 → 生成事件 → 生成前事件命令行里面,如下脚本: echo;if "$(ConfigurationName)"=="Release" (if exist "$(ProjectDir)..\FileVersion.bat" "$(ProjectDir)..\FileVersion.bat" "$(ProjectDir)Properties\AssemblyInfo.cs") echo; echo;========================================================== echo; set filePath="%1" SET filePath="%filePath:"=%" if %filePath%=="" (echo parameter is null&goto :eof) set oldAssemblyVersion= set oldAssemblyFileVersion= set t=%time: =0% set /a TotalSeconds=1%t:~0,2% %% 100 * 3600 + 1%t:~3,2% %% 100 * 60 + 1%t:~6,2% %% 100 set /a TotalSeconds=%TotalSeconds%/2 set newAssemblyVersion=[assembly: AssemblyVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%TotalSeconds%")]//%date:~0,4%-%date:~5,2%-%date:~8,2% %t% set newAssemblyFileVersion=[assembly: AssemblyFileVersion("%date:~0,4%.%date:~5,2%.%date:~8,2%.%TotalSeconds%")]//%date:~0,4%-%date:~5,2%-%date:~8,2% %t% rem 查找并匹配最后一行,包含"[assembly: AssemblyVersion"和"[assembly: AssemblyFileVersion"的字符串 for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyVersion" %filePath%') do (set "oldAssemblyVersion=%%a") for /f "delims=" %%a in ('findstr /b /c:"[assembly: AssemblyFileVersion" %filePath%') do (set "oldAssemblyFileVersion=%%a") rem 读取所有行,并替换AssemblyVersion的字符串 if not "%oldAssemblyVersion%"=="" ( for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filePath%') do ( set "str=%%b" & if "!str!"=="%oldAssemblyVersion%" (set "str=%newAssemblyVersion%") echo.!str!>>$) move $ %filePath%) rem 读取所有行,并替换AssemblyFileVersion的字符串 if not "%oldAssemblyFileVersion%"=="" ( for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filePath%') do ( set "str=%%b" & if "!str!"=="%oldAssemblyFileVersion%" (set "str=%newAssemblyFileVersion%") echo.!str!>>$) move $ %filePath%) goto :eof
那么最关心的是如何调用?在项目属性的生成事件中的生成前事件中执行这个bat文件,调用方式(根据自己的路径配置):
另外,其实根据上面的思想,我们可以使用python等外部程序来做更多的可能性,可以随意修改程序源文件。
----------------------------------------
问题总结
版本和中使用*通配无法编译
我在使用VS2017创建的类库的项目的时候,想按照上面的说的[assembly: AssemblyVersion("1.0.*")]来自动增加版本号的,但是修改后,在编译的时候出错,错误提示如下:
错误 CS8357 指定的版本字符串中包含与确定性不兼容的通配符。从版本字符串删除通配符,或者禁用此编译的确定性 PVG.Lib ....\PVG.Lib\Properties\AssemblyInfo.cs 35
这个情况我就奇怪了,为什么我的其他的项目都可以用,这个项目不可以这样用?于是我又创建了一些其他的类库等进行测试,同样的问题。从错误提示看应该是项目的配置不正确。
不死心啊,打开之前正常的自动版本号的程序和这个项目的文件(.csproj)进行比较,去掉项目文件和引用等,其实两个项目文件不同的地方不多,那就一个一个是试试,到底是哪个项目属性影响导致的问题。当试到<Deterministic>True</Deterministic>的时候,发现我新建的项目都是true,而之前的项目这个属性是false,修改成fasle编译测试,通过了,不报错了。于是拿<Deterministic>到网上查,说是.NET Core默认的设置。由于时间比较紧,也没细查其他的,等有空了在查<Deterministic>的说明
-------------------------------------------
重复的AssemblyVersion属性
我有一个项目,在编译时会产生以下错误:
错误CS0579:“ AssemblyVersion”属性重复
我已经检查了文件AssemblyInfo.cs
,看起来那里没有重复。
我在MSDN上找到了解决类似问题的这篇文章,并且按照本文中的建议也解决了该问题。
谁能告诉我这是怎么回事?仅在具有两个或更多个名称相似的类的项目时才发生这种情况吗?或者是别的什么?
回答
从Visual Studio 2017开始,另一个继续使用AssemblyInfo.cs
文件的解决方案是关闭自动组装信息生成,如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>
我个人觉得对于需要同时支持.NET Framework和.NET Standard的项目非常有用。
还有,可以使用预编译命令:
编辑您的AssemblyInfo.cs文件,在#if!NETCOREAPP3_0 ...... #endif 编写内容(未经过测试)
出处:https://qastack.cn/programming/10311347/duplicate-assemblyversion-attribute
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/9430846.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2018-08-06 16:11 jack_Meng 阅读(2864) 评论(0) 编辑 收藏 举报