多种方式获取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: AssemblyVersion("1.0.0.0")] 

        [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;

 

 
以上是将SVN信息存成文件后,再读取来实现的。也可以考虑直接将SVN的版本信息写到AssemblyInfo.cs中,然后再获取。

 

出处: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 withTTextif the entry is versioned, orFTextif not.
$WCNEEDSLOCK$ $WCNEEDSLOCK?TText:FText$is replaced withTTextif the entry has thesvn:needs-lockproperty set, orFTextif not.
$WCISLOCKED$ $WCISLOCKED?TText:FText$is replaced withTTextif the entry is locked, orFTextif 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 7if 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 8if 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 9if 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%
View Code

 

再次优化,不需要单独的版本号文件,可以和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
View Code

 

版本二

优化:直接把 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
View Code

 

版本三

优化:调整生成的格式为:[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
View Code

 

版本四

优化:支持[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
View Code

 

版本五

优化:增加“使用说明”

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
View Code

 

那么最关心的是如何调用?在项目属性的生成事件中的生成前事件中执行这个bat文件,调用方式(根据自己的路径配置):

if exist "\$(ProjectDir)..\FileVersion.bat" "\$(ProjectDir)..\FileVersion.bat" "\$(ProjectDir)Properties\AssemblyInfo.cs"

另外,其实根据上面的思想,我们可以使用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

posted on 2018-08-06 16:11  jack_Meng  阅读(2864)  评论(0编辑  收藏  举报

导航