确定装配框架而不加载它

时间:2017-12-01 16:59:35

标签: c# reflection .net-assembly

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

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

注意:我知道使用PowerShell可以实现这一点,但目标环境中没有该工具。

请注意,我不需要找出程序集的版本,但需要找到它所需的Framework版本。

1 个答案:

答案 0 :(得分:0)

好吧,虽然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;