在不使用反射的情况下,是否可能在编译时获取程序集信息?

4

使用反射在运行时获取程序集信息非常简单:

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

然而,由于受限制的执行环境,我不能在项目中使用反射。在有限的信任环境中,这段代码将无法运行。
我想在编译时使用AssemblyInfo.cs中的一些属性来显示产品名称、版本等,而不需要调用反射机制。
最原始的方法是将AssemblyInfo.cs文件中的字符串复制到其他地方作为常量字符串。但也许存在更优雅的解决方案吗?
当然,关于程序集的一些基本信息只能通过反射在运行时正确解析。比如程序集路径、执行上下文等。但是关于名称和版本的信息写在项目代码中,应该在编译时正常可用。
欢迎提出任何评论和想法。谢谢。

2
据我所知,获取程序集版本的方法只有三种。第一种是使用反射,第二种是使用“可执行文件分析”(这是我在C/C++应用程序中获取C/C++库版本的方式)。这两种方法都只能在运行时使用。至少第三种方法是一种反向方法。您不会“获取版本”,而是使用常量字符串来“设置版本”。由于它是一个常量,因此您可以在编译时就使用这个常量字符串。 - Julo
1
https://dev59.com/y3I-5IYBdhLWcg3w48xP#27822637 - user585968
1
很遗憾,在“Attributes”中你只能使用常量值,因此这是唯一的方法。我见过一个项目采用了这种方法。该常量是由外部脚本生成的 (makefile/shell/automake/e.t.c.) 并在“AssemblyVersionAttribute”中使用。虽然这不同于我的建议,但应该不会有大问题 *(除了 Visual Studio 如何对使用版本号的非标准方法作出反应的方式)*。 - Julo
2
@BorisZinchenko "你的建议行不通,因为它使用了反射" - 完全是胡说八道!FileVersionInfo.GetVersionInfoSystem.Diagnostics的一部分,不使用反射。你甚至有没有好好读过它?它读取每个DLL和EXE中的FILEVERSION,与.NET、更不用说反射相关的API毫无关系。 - user585968
当你说“在编译时”时,指的是哪个过程来检索和显示该信息?你是在编写自定义构建脚本吗?我认为你的问题不够清晰。 - McGuireV10
显示剩余8条评论
1个回答

2

由于目前还没有发布答案,我将发布一种变体,这是基于对问题的评论而得出的。正如@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;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接