当前位置 : 主页 > 网络推广 > seo >

从.Net程序集检索目标框架版本和目标框架配置文件

来源:互联网 收集:自由互联 发布时间:2021-06-16
有没有什么办法,我可以访问用于TargetFrameworkVersion和/或TargetFrameworkProfile的值在.Net程序集编译时? 我所说的值是包含项目文件的值 ?xml version="1.0" encoding="utf-8"?Project ToolsVersion="4.0" Defau
有没有什么办法,我可以访问用于TargetFrameworkVersion和/或TargetFrameworkProfile的值在.Net程序集编译时?

我所说的值是包含项目文件的值

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OtherStuff>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
    <OtherStuff>
  </PropertyGroup>
  <OtherStuff>
  </OtherStuff>
</Project>

基本上我想知道当编译程序集时框架的目标版本,以及目标框架配置文件的可能性.

而且我不是在说现在加载的CLR版本,Environment.Version不是我以后的版本.

理想情况下,解决方案将使用System.Reflection,但如果我必须诉诸其他方法,我会的.

如果您对编译程序集的CLR版本感到满意,可以使用 Assembly.ImageRuntimeVersion属性.根据MSDN,该属性:

representing the version of the common language runtime (CLR) saved in the file containing the manifest.

By default, ImageRuntimeVersion is set to the version of the CLR used to build the assembly. However, it might have been set to another value at compile time.

当然,这并不给你.NET Framework的特定版本(例如:.NET Frameworks 2,3.0和3.5都在2.0 CLR上).

如果CLR版本不够,您可以尝试“估计”(智能猜测)它所引用的程序集所需的版本.对于.NET 1和4,CLR版本应该是足够的.但是,如果CLR版本为2.0,则不知道是否意味着2.0,3.0或3.5,以便您可以尝试更多的逻辑.例如,如果您看到该程序集引用System.Core(使用Assembly.GetReferencedAssemblies()),那么您将知道该版本为3.5,因为System.Core是3.5中的新增功能.这并不是完全固定的,因为有关的议会可能不会使用大会的任何类型,所以你将无法捕捉到.为了尝试捕获更多的情况,您可以循环遍历所有引用的程序集并检查其版本号 – 也许过滤到只有从System开始的程序集,以避免与其他程序库的误报.如果您看到所引用的任何System.*程序集的版本为3.5.x.x,那么您也可以确定它是为3.5构建的.

正如你所注意到的那样,我不相信TargetFrameworkProfile在Visual Studio之外转义.但是,如果应用程序碰巧有一个app.config文件,Visual Studio可能会将目标框架放在那里.例如,如果您将项目设置为使用4.0客户端配置文件,Visual Studio将创建一个这样的app.config:

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
  </startup>
</configuration>
网友评论