是否有可能在编译时获得汇编信息而不进行反射?

时间:2018-03-25 08:32:39

标签: c#

使用反射在运行时获取程序集信息是微不足道的:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);

但是,由于执行环境受限,我无法在项目中使用反射。在有限的信任环境中,此代码不起作用。

我想在编译时使用AssemblyInfo.cs中的一些属性来显示产品名称,版本等,而无需调用反射机制。

最原始的方法就是将AssemblyInfo.cs文件中的字符串作为常量字符串复制到其他地方。但也许存在一些更优雅的解决方案?

当然,只有在运行时通过反射才能正确解决有关装配的一些基本信息。比如说,程序集路径,执行上下文等。但是有关名称和版本的信息是用项目代码编写的,通常在编译时可用。

任何评论和想法都表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

由于到目前为止没有人发布答案,我将根据对该问题的评论发布一个变体。正如@Julo建议的那样,我采取了与从属性获取信息完全相反的方式,而是决定在类中进行常量定义:

public class Resource
{
    public const string VERSION = "1.0.0.0";
    public const string COMPANY = "Company";
    public const string APPICATION = "App";
}

然后我将这些值传递给程序集属性:

[assembly: AssemblyTitle(Resource.APPICATION)]
[assembly: AssemblyCompany(Resource.COMPANY)]
[assembly: AssemblyVersion(Resource.VERSION)]
[assembly: AssemblyFileVersion(Resource.VERSION)]

当然,我也可以在编译时在我的代码中访问这些:

string tool = null, version = null;
//System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
//System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
//if (string.IsNullOrEmpty(tool) && fvi != null) tool = fvi.ProductName;
//if (string.IsNullOrEmpty(version) && fvi != null) version = fvi.FileVersion;
tool = Resource.APPICATION;
version = Resource.VERSION;

这里的缺点可能是构建环境中的自动版本增量工具无法访问这些常量。优点可以是常量可以作为单个文件在许多项目之间共享,以实现整个解决方案的软件化版本管理。