我的应用套件中的每个组件都在AssemblyInfo.cs
中指定以下内容进行标识:
..
[assembly: AssemblyVersion("MM.nnn.*")]
[assembly: AssemblyTitle( "Component Title" )]
#if DEBUG
[assembly: AssemblyDescription( "<Component>.Debug" )]
[assembly: AssemblyConfiguration( "Debug" )]
#else
[assembly: AssemblyDescription( "<Component>.Release" )]
[assembly: AssemblyConfiguration( "Release" )]
#endif
每个组件的启动通常涉及以下顺序:
Assembly asm = Assembly.GetExecutingAssembly( );
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo( asm.Location );
Utils.sModInfo = string.Format( Utils.scFmtModId, fvi.FileDescription, fvi.Comments,
fvi.FileVersion, Utils.GetBuildFromVersion( fvi.FileVersion ) );
出于完整性考虑:
/// <summary>Returns build-date/time, extracted from the version string
(use on 'MM.nnn.*'-versioned assemblies)</summary>
public static DateTime GetBuildFromVersion( string sVersion )
{
DateTime dB = new DateTime( 2000, 1, 1 );
string[] sa = sVersion.Split( '.' );
if( sa.Length == 4 )
{
dB = dB.AddDays( Convert.ToInt32( sa[ 2 ] ) );
dB = dB.AddSeconds( Convert.ToInt32( sa[ 3 ] ) << 1 );
}
return dB;
}
现在,Xamarin.Android项目共享许多库代码,我想对相同的概念性任务使用相同的方法。因此,我创建了AssemblyInfo.cs
,并进行了相应的填充。.
在Debug
版本中,一切工作都很好:属性已正确检索和显示。
我后来发现,第一个Release
版本崩溃了,无法获取asm.Location
。
所以我将#if DEBUG .. #endif
放在该代码周围,然后继续。.
今天,我意识到FileVersionInfo
并不是必须的,因此将Android启动程序更改为:
string sVersion = asm.GetName( ).Version.ToString( ),
sFileDsc = string.Empty,
sComment = string.Empty;
foreach( Attribute attr in asm.GetCustomAttributes( true ) )
{
if( attr.GetType( ) == typeof(AssemblyTitleAttribute) )
sFileDsc = ((AssemblyTitleAttribute)attr).Title;
else
if( attr.GetType( ) == typeof(AssemblyDescriptionAttribute) )
sComment = ((AssemblyDescriptionAttribute)attr).Description;
}
Utils.sModInfo = string.Format( Utils.scFmtModId, sFileDsc, sComment,
sVersion, Utils.GetBuildFromVersion( sVersion ) );
这在Debug
的版本中完美地工作了。在Release
中只给了我一个版本号!
将适当的(与所有其他组件相同的 和可比较的)版本#很好,我会接受的。
但是 Assembly*Attributes
构建中的其余Release
会发生什么?