Określ wersję szkieletową (CLR) montażu

Z wiersza poleceń (lub w jakikolwiek inny sposób), jak Mogę określić, która wersja CLR Wersja A . NET wymaga montażu?

Muszę ustalić, czy montaż wymaga wersji 2.0 Czy 4.0 CLR.

Author: Peter Mortensen, 2010-02-22

11 answers

ildasm.exe pokaże go, jeśli dwukrotnie klikniesz na "MANIFEST" i poszukasz "wersja metadanych". Domyślnie jest to wersja, z którą skompilowano obraz.

 50
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 12:06:13
class Program {
  static void Main(string[] args) { 
      System.Console.WriteLine(
             System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion);
  }
}

Skompiluj i uruchom powyższą aplikację pod najnowszym. NET Framework (ponieważ starszy CLR może nie być w stanie załadować zestawów wymagających nowszego CLR) i uruchom ją przekazując ścieżkę do zestawu, który chcesz sprawdzić jako argument wiersza poleceń.

 31
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 12:12:17

Jedno wyjaśnienie...

Problem ze wszystkimi wymienionymi metodami polega na tym, że zwrócą one wersję 4.0, jeśli assembly został skompilowany z. NET framework 4.0, 4.5 lub 4.5.1.

Sposób, aby dowiedzieć się tej wersji programowo w czasie wykonywania jest za pomocą systemu.Runtime.Wersjonowanie.TargetFrameworkAttribute dla danego zestawu, na przykład

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;

...    

object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true);
var attribute = list.OfType<TargetFrameworkAttribute>().First();

Console.WriteLine(attribute.FrameworkName);
Console.WriteLine(attribute.FrameworkDisplayName);

Powróci

a.FrameworkName ".NETFramework,Version=v4.0"    string
a.FrameworkDisplayName  ".NET Framework 4"      string

a.FrameworkName ".NETFramework,Version=v4.5"    string
a.FrameworkDisplayName  ".NET Framework 4.5"    string

a.FrameworkName ".NETFramework,Version=v4.5.1"  string
a.FrameworkDisplayName  ".NET Framework 4.5.1"  string
 31
Author: Fernando Gonzalez Sanchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-20 16:41:31

Oto PowerShell odpowiednik kodu.NET sugerowanego w innej odpowiedzi. Korzystanie z PowerShell oznacza, że można pominąć kilka kroków, takich jak tworzenie i kompilowanie złożenia.

Po uruchomieniu programu PowerShell uruchom następujące polecenie:
[System.Reflection.Assembly]::LoadFrom("C:\...\MyAssembly.dll").ImageRuntimeVersion

Domyślnie PowerShell używa środowiska wykonawczego. NET v2, więc otrzymasz wyjątek dla zestawów targetujących v4. Pytanie o przepełnienie stosu Jak mogę uruchomić PowerShell z. Net 4 runtime? szczegóły metody zmiany tego, jeśli wymagane.

 9
Author: Robin Minto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:45

Z linii poleceń

DUMPBIN your dll / exe / CLRHEADER

 5
Author: Tinku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 12:14:08

Sugerowałbym użycie ReflectionOnlyLoadFrom () inpted of LoadFrom ()

Ma tę zaletę, że może załadować zespoły x64 i ia64 podczas pracy na maszynie x86, podczas gdy loadfrom () tego nie zrobi.

Chociaż nadal nie ładuje zestawów. Net 4.0 z powershell 2.0.

 4
Author: mistika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-04 14:20:00

Jak zasugerował @mistika, lepiej używać ReflectionOnlyLoadFrom() zamiast LoadFrom(). Minusem tego jest to, że wywołanie GetCustomAttributes() na złożeniu załadowanym ReflectionOnlyLoadFrom() rzuca wyjątek. Musisz zadzwonić GetCustomAttributesData() zamiast:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
var customAttributes = assembly.GetCustomAttributesData();
var targetFramework = customAttributes.FirstOrDefault(attr => attr.AttributeType.Equals(typeof(TargetFrameworkAttribute)));

var frameworkName = string.Empty;
var frameworkDisplayName = string.Empty;
if (null != targetFramework)
{
    if(targetFramework.ConstructorArguments.Any())
    {
        // first argument is the name of the framework.
        frameworkName = (string)targetFramework.ConstructorArguments[0].Value;
    }

    // search for a named argument called "FrameworkDisplayName"
    var frameworkDisplayNameArg = targetFramework.NamedArguments.FirstOrDefault(arg => arg.MemberName.Equals("FrameworkDisplayName"));
    if (null != frameworkDisplayNameArg)
    {
        frameworkDisplayName = (string)frameworkDisplayNameArg.TypedValue.Value;
    }
}

Console.WriteLine("Framework Name: " + frameworkName);
Console.WriteLine("Framework Display Name: " + frameworkDisplayName);
 2
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 13:26:56

Oto PowerShell one liner, który wyświetli Target Framework version dla zestawów skierowanych do wersji v4 i nowszych.

 Resolve-Path($args) | Select @{N='Assembly'; E={$_ }}, @{N='TargetFramework'; E={(([Reflection.Assembly]::ReflectionOnlyLoadFrom($_).GetCustomAttributesData() | Where-Object { $_.AttributeType -like "System.Runtime.Versioning.TargetFrameworkAttribute" })).NamedArguments.TypedValue}} | Format-Table

Użycie:

C:\test\> show-targetfw.ps1 *.dll

Assembly             TargetFramework
--------             --------
C:\test\a.dll        ".NET Framework 4.6.1"
C:\test\b.dll        ".NET Framework 4.5.2"
 2
Author: Anders Forsgren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 07:55:33

Bardzo fajnym narzędziem jest JustDecompile z Telerik. Możesz otworzyć zespoły, a narzędzie pokazuje, czy są one ukierunkowane na 4.5, 4.5.1 lub 4.6

 1
Author: xforfun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-21 15:04:15

Jeśli chcesz włączyć wynik w skrypcie, zalecam użycie wyjścia tekstowego ildasm.exe, a następnie grep "version String" z wyjścia.

"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" /text D:\LocalAssemblies\Toolfactory.Core.BaseTypes.dll /noil /headers | find "' Version String"

Uwaga dodaję', więc find polecenie nie rozpoznaje "długości ciągu wersji"

 0
Author: ferarias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 15:35:08

Spróbuj użyć tego pliku Assembly Information wykonywalnego, aby uzyskać wersję assembly, która mówi, że wymagana jest wersja CLR, a także inne informacje takie jak opcje kompilacji, Procesor docelowy i referencje:

Tutaj wpisz opis obrazka

 -1
Author: yantaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-10 00:19:41