2012-04-11 61 views
3

我想通过程序集来检查其他.NET应用程序正在使用的框架版本。我发现两种方法得到的框架(首先通过ImageRunetimeVersion与组件的全名)的版本,但我从中得到两个不同的值,我不知道这是正确的:c#从程序集中获取框架/运行时版本

 Assembly ass = Assembly.LoadFrom(autPath);    
     string imageRuntimeVersion = ass.ImageRuntimeVersion; 
     Console.WriteLine("ImageRunetimeVersion: " + imageRuntimeVersion); 
     Console.WriteLine("FullName: " + ass.FullName); 

     Console.WriteLine("");    
     Console.WriteLine("----"); 
     Console.WriteLine("Referenced Assemblies: "); 
     Console.WriteLine(""); 

     AssemblyName[] referencedAssemblies = ass.GetReferencedAssemblies(); 
     foreach (AssemblyName a in referencedAssemblies) 
     { 
      Console.WriteLine(a.FullName); 
     } 

如果我要用我的应用程序和例如paint.net测试这个结果,结果如下:

就像你可以看到我不能说哪个“版本”是正确的。最大的问题是,如果我打算看看我的项目属性为我的.net应用程序的目标平台是3.5而不是2.0或1.0-

+0

“ImageRunetimeVersion”中的版本与通过全名调用的版本不同。最后一张图:第一版:v.2.0.50727第二版:1.0.0.0。现在我不知道这两个是由应用程序 – dontcare 2012-04-11 12:12:07

回答

5

我想我可以为你清除一些事情。首先,FullName属性为您提供应用程序版本号。这是您设置的数字,与.NET框架版本没有任何关系。这意味着FullName属性中的版本号可以被忽略。

imageRuntimeVersion是CLR版本。不幸的是,2.0包含.NET 2.0,3.0和3.5。从技术上讲,你的应用程序给你正确的信息,但它不是你想要的信息(我不认为)。

下面是一个SO文章有更多的解释: Retrieve Target Framework Version and Target Framework Profile from a .Net Assembly

那篇文章给你一对夫妇的建议,包括寻找一个配置文件,这将使你作为目标的框架或看图书馆的版本的被使用。两者都不是真正的万无一失,但据我所知,这是你能做的最好的事情。

+0

我有怀疑,我从显示的版本号有错误的想法,感谢间隙使用正确的框架版本。 – dontcare 2012-04-11 12:26:22

1

TargetFramework不是相同的CLR版本。

例如,

CLR 4.0 TargetFramework:.NET 4.0和.NET 4.5

使用TargetFrameworkAttribute http://www.lucbos.net/2011/08/get-targetframework-for-assembly.html

注A液:TargetFrameworkAttribute只能从.NET 4.0。

var targetFramework = "Unknown"; 
    var targetFrameworkAttributes = assembly.GetCustomAttributes(typeof(System.Runtime.Versioning.TargetFrameworkAttribute), true); 
    if (targetFrameworkAttributes.Length > 0) 
    { 
     var targetFrameworkAttribute = (TargetFrameworkAttribute)targetFrameworkAttributes.First(); 
     targetFramework = (targetFrameworkAttribute.FrameworkDisplayName); 
    } 
相关问题