【问题标题】:Determine assembly framework without loading it确定装配框架而不加载它
【发布时间】:2017-12-01 16:59:35
【问题描述】:

我正在编写一个 C# 控制台应用程序,它必须在 .NET Framework 2.0 下运行,但需要能够识别程序集的框架版本,即使它高于 .NET 2.0。

我不能使用AssemblyName.GetAssemblyName 或相关函数,因为如果目标程序集是在更高版本的框架下构建的,它们会抛出BadImageFormatException。有没有办法在不尝试以任何方式加载程序集的情况下获取这些信息?

注意:我知道使用 PowerShell 可以做到这一点,但该工具在目标环境中不可用。

另请注意,我不需要找出程序集的版本,而是它所需的框架版本。

【问题讨论】:

  • 不正确。那是程序集本身的版本,而不是编译它所针对的框架的版本。

标签: c# reflection .net-assembly


【解决方案1】:

好吧,虽然Assembly.ReflectionOnlyLoadFrom 会因错误的框架而窒息,但我找到了一种方法,将程序集读取为字节数组,然后使用 ReflectionOnlyLoad 对其进行分析。

FileStream fs = File.OpenRead(tgtAssembly);
int asmLength = fs.Length > int.MaxValue ? int.MaxValue : (int)fs.Length;
byte[] buffer = new byte[asmLength];
fs.Read(buffer, 0, asmLength);
Assembly asm = Assembly.ReflectionOnlyLoad(buffer);
string frameworkVer = asm.ImageRuntimeVersion;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多