Получение версии целевой платформы и профиля целевой платформы из сборки .Net - PullRequest
16 голосов
/ 28 июля 2011

Есть ли способ получить доступ к значениям, которые использовались для 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>

В основном, я хотел бы узнать, какой была Целевая версия Framework при компиляции сборкии, если возможно, профиль целевого фреймворка.

И я не говорю о текущей загруженной версии CLR, Environment.Version - это не то, что мне нужно.

В идеале решение будет использоватьSystem.Reflection, но если мне придется прибегнуть к другим методам, я сделаю это.

Ответы [ 4 ]

12 голосов
/ 13 сентября 2011

Если вас устраивает версия CLR , скомпилировавшая сборку, вы можете использовать свойство Assembly.ImageRuntimeVersion.Согласно MSDN, это свойство:

представляет версию общеязыковой среды выполнения (CLR), сохраненную в файле, содержащем манифест.

и

По умолчанию для ImageRuntimeVersion установлена ​​версия CLR, используемая для сборки сборки.Однако во время компиляции ему могло быть присвоено другое значение.

Конечно, это не дает конкретной версии .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.xx, то вы также можете быть уверены, что она была построена для 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>
4 голосов
/ 30 мая 2014

Если сборка была скомпилирована с атрибутом TargetFrameworkAttribute (область действия сборки), вы можете легко и единообразно определить цель профиля платформы.

Попробуйте этот пример и укажите свои собственные пользовательские сборки с разными целями.

class Program
{
    static void Main(string[] args)
    {


        // Lets examine all assemblies loaded into the current application domain.
        var assems = AppDomain.CurrentDomain.GetAssemblies();

        // The target framework attribute used when the assemby was compiled.
        var filteredType = typeof(TargetFrameworkAttribute);

        // Get all assemblies that have the TargetFrameworkAttribute applied.
        var assemblyMatches = assems.Select(x => new { Assembly = x, TargetAttribute = (TargetFrameworkAttribute)x.GetCustomAttribute(filteredType) })
                                    .Where(x => x.TargetAttribute != null);

        // Report assemblies framework target
        foreach (var assem in assemblyMatches)
        {
            var framework = new System.Runtime.Versioning.FrameworkName(assem.TargetAttribute.FrameworkName);
            Console.WriteLine("Assembly: '{0}' targets .NET version: '{1}'.",
                                assem.Assembly.FullName,
                                framework.Version);
        }

        Console.ReadLine();
    }
}
0 голосов
/ 10 мая 2018

Решение njappboy прекрасно работает. Мне нужна версия VB.Net, так что вот преобразование.

Dim assems = AppDomain.CurrentDomain.GetAssemblies()
Dim filteredType = GetType(Runtime.Versioning.TargetFrameworkAttribute)
Dim assemblyMatches = assems.[Select](Function(x) New With {Key .Assembly = x,
            Key .TargetAttribute = CType(x.GetCustomAttribute(filteredType),
            Runtime.Versioning.TargetFrameworkAttribute)}).Where(
            Function(x) x.TargetAttribute IsNot Nothing)
For Each assem In assemblyMatches
    Dim framework = New System.Runtime.Versioning.FrameworkName(
        assem.TargetAttribute.FrameworkName)

    Console.WriteLine("Assembly: '{0}' targets .NET version: '{1}'.",
                      assem.Assembly.FullName, framework.Version)
Next
0 голосов
/ 19 июля 2016

Попробуйте также этот пример получить целевую и текущую версии .NET Framework во время выполнения (работает для .NET V4.X):

    Dim ca As Object() = System.Reflection.Assembly.GetEntryAssembly().GetCustomAttributes(False)

    For Each c In ca.Where(Function(x) x.TypeId.Name = "TargetFrameworkAttribute")
        Console.WriteLine("Target .NET framework for " & Application.ProductName & " : " & c.FrameworkDisplayName)
    Next

    Console.WriteLine("Current .NET framework for " & Application.ProductName & " : " & System.Diagnostics.FileVersionInfo.GetVersionInfo(GetType(Integer).Assembly.Location).ProductVersion)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...