Dll için .NET Framework sürümünü belirleme


137

.NET çerçevesine karşı derlenen ve dağıtılan eski bir dll var. Hangi .NET framework sürümü karşı derlendi emin değilim. Nasıl bu dll karşı derlendi .NET framework hangi sürümünü belirleyebilir merak ediyorum? Visual Studio 2008'e yükseltildiğini ve .NET framework sürüm 3.5 olarak değiştirildiğini düşündüğüm için kaynak koduna güvenemiyorum.


Yanıtlar:


49

Reflektöre yükleyin ve neyi referans aldığını görün?

Örneğin:

resim açıklamasını buraya girin


1
Benim fikrim de, ama reflektör bilmek, muhtemelen şikayet edecek ve güzel bir descript olmayan hata simgesi verecektir.
leppie

@ leppie .NET 1.1 olsa bile sorun olmamalı. Varsayılan montaj listenizi değiştirmeniz yeterlidir.
ParmesanCodice

Cevabınız çok faydalı, ancak körü körüne güvenmemeyi tavsiye ediyorum - dün .Net 4.0'ı hedefleyen, Reflector tarafından .Net 4.0.3'ü kullanması ve bildirmesi gereken kendi projemde çok fazla zaman geçirdim .Net 4.5 by Windows :-) Bunu projede kaynaklardan başka doğrulamak için herhangi bir yöntem bilmiyorum - buraya bakın: stackoverflow.com/questions/13214503/…
greenoldman

3
Kat Lim Ruiz'in belirttiği gibi ücretsiz, açık kaynaklı alternatif ILSpy'yi de kullanabilirsiniz .
Marcus Mangelsdorf

Bu cevap benim için çalıştı: stackoverflow.com/a/3461027/2961177 .
ckkkitty

128

PowerShell'de hedef çalışma zamanını almak için aşağıdakileri kullanabilirsiniz:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

Bunu Ben Griswold'un cevabından PowerShell'e uyarladım .

Visual Studio'da belirtilen hedef çerçeve sürümünü bilmek istiyorsanız, şunu kullanın:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

Gibi bir şey almalısın

.NETFramework, sürüm v4.5.2


4
Bu cevap en yardımcısıdır. 2003'ten sonraki tüm Windows işletim sistemleri Powershell'i destekler. Diğer yanıtların çoğunun önerdiği gibi ek uygulama desteği gerektirmeyen anında geri bildirim veren bir kabuk. Bir dll "bir kapalı" kontrol için harika. sen adamsın @swoogan.
Nathan McCoy

1
Bunu, bir TargetFrameworkVersion v3.5 ile oluşturduğum bir DLL için yaptım ve v2.0.50727 döndürdü. Neyi kaçırıyorum?
BHSPitMonkey

4
@BHSPitMonkey gerçekten sadece 4 çalışma zamanı sürümü olmuştur: 1.0, 1.1, 2.0 ve 4.0. .NET 3.0 ve 3.5, CLR sürüm 2.0 için derleyin. msdn.microsoft.com/tr-tr/library/bb822049(v=vs.110).aspx
Swoogan

1
Bu komut dosyası yalnızca RuntimeVersion sağlar, soru TargetFrameworkversion ile ilgilidir. 2.0.3.0.3.5'e karşı derlenen tüm derlemeler için bu komut dosyası Çalışma Zamanı sürümünü 2.0.0.0 olarak gösterir
Kiran Vedula

3
Benim için ReflectionOnlyLoadFrom ImageRuntimeVersion öğesini döndürür ancak sıfır CustomAttributes döndürür. ReflectionOnlyLoadFrom yerine LoadFrom kullanılması beklenen sonucu verir. Herhangi bir nedenle? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander

69

dotPeek bu bilgiyi göstermek için harika (ücretsiz) bir araçtır.

Reflektör'ü ele almak için birkaç sorun yaşıyorsanız, bu iyi bir alternatiftir.

resim açıklamasını buraya girin


4
FYI, bir sorun nedeniyle DotPeek'ten JustDecompile'a geçtim: "belirli sürüm = yanlış" seçeneğini belirlerseniz DotPeek boş bir sürüm gösterdi ve JustDecompile doğru sürümü gösterir. Bana geçiş yapmaya değer yaptı.
ashes999

Harika - Reflector için bir deneme yüklemeden tam olarak istediğimi yaptım.
bernhardrusch

49

Kullanabilirsiniz ILDASM'ı ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

ve çıktıdaki 'Meta veri bölümünü' kontrol edin. Böyle bir şey olurdu:

Meta veri bölümü: 0x424a5342, sürüm: 1.1, ekstra: 0, sürüm len: 12, sürüm: v4.0.30319

'Version' etiketi size .NET Framework sürümünü söyleyecektir. Yukarıdaki örnekte 4.0.30319


3
Burada ne arıyorum? Bu .NET 4.0 anlamına mı geliyor? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX

Evet, .NET 2 için aşağıdakileri alıyorum: // Meta veri bölümü: 0x424a5342, sürüm: 1.1, ekstra: 0, sürüm len: 12, sürüm: v2.0.50727
Simon

17

Birkaç seçeneğiniz vardır: Yönetilen koddan programlı olarak almak için Assembly.ImageRuntimeVersion kullanın:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

Komut satırından, v2.0'dan başlayarak, "MANIFEST" e çift tıklayıp "Meta veri sürümü" aradığınızda ildasm.exe bunu gösterecektir. Bir Görüntünün CLR Sürümünü Belirleme


CurrentAppDomain için ImageRuntimeVersion'u nasıl edinebilirsiniz?
Kiquenet


15

Basitçe

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

1
Bu neden indirildi bilmiyorum, ama snippet (System.Runtime.Versioning başvuru gereklidir) çalıştırabilir ve başarıyla çıktı almak (bu LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, Sürüm = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra

Bu kod, çerçevenin tam sürümünü almaz. "4.0" bilmek iyidir, ama "v4.0.30319" RegAsm.exe almak için çalışıyor olsaydı daha yararlı olurdu. Daha eksiksiz sürüm bilgisi şu adreste bulunabilir: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Martin

Bu doğru bir yaklaşım gibi görünüyor, bir meclisin bu niteliğe sahip olmadığı durumlar var mı? Bir .NET Core derlemesi ile test ettim ve netcore ve sürüm numarasını doğru bir şekilde raporladı.
Adam Naylor

Bu benim için işe yaramıyor. Bir GetCustomAttributesyok TargetFrameworkAttribute. Ancak ImageRuntimeVersion iyi çalışıyor, ikilinin oluşturulduğu doğru CLR'yi alıyor. Onun için inşa edildi hedef çerçeve sürümüne ihtiyacım var.
Shameel Mohamed

13

Visual Studio ile başka bir seçenek, herhangi bir projeye DLL'ye bir başvuru ekleyin, ardından yeni referansı sağ tıklatıp Özellikler'i tıklatın, Çalışma Zamanı sürümünde aradığınızı görebilirsiniz:

resim açıklamasını buraya girin


Bence bu soru bir DLL Visual Studio'da başvurulduğunda, ancak bilgisayarınızda yalan bulduğunuz herhangi bir '.NET DLL hakkında sormuyor.
ashes999

7
Bu yanıt, bilgisayarınızda yalan bulduğunuz herhangi bir '.NET DLL başvurusunu ekleyebileceğinizi ve bu DLL'ye karşılık gelen Başvurular altındaki öğenin özelliklerinden birinin "Çalışma Zamanı Sürümü" olduğunu gösterir.
ALEXintlsos

8

ILDASM ile kaynak koda dönüştürün ve başvurulan mscorlib sürümüne bakın (hemen üstte olmalıdır).


4

En basit yol: .dll dosyasını herhangi bir metin düzenleyicisinde açmanız yeterlidir. Son satırlardan birine bakın: resim açıklamasını buraya girin


Aralarında en iyi seçenek
Sisir

2
Ancak, .Net 3.0
Sisir

2

Bunu yapmak için bu C # konsol uygulamasını hızlı bir şekilde yazdım:

https://github.com/stuartjsmith/binarydetailer

Sadece parametre olarak bir dizin geçmek ve orada her dll ve exe için net çerçeve söylemek için elinden geleni yapacağız


İyi ayrıntılı bilgi verir; bir komut satırı uygulaması; komut satırında dizin adını iletmeniz gerekir.
philu

2

" It Easy Algılama Die dosya türlerini belirlemek için bir programdır olarak da bilinir". .Dll dosyalarıyla veya diğer (.exe) dosyalarla çalışır. Ticari ve ticari olmayan kullanım için mutlak ücretsizdir.

resim açıklamasını buraya girin


0

Eğer varsa DotPeekdan JetBrains, bunu görebilirsiniz Assembly Explorer.

Bu ekran görüntüsünü görebiliyor musunuz?  değilim:(


0

Buradaki cevapları genişleterek, bağımlı bir meclis varsa bu patlayabilir. Eğer şanslıysanız ve bağımlıların nerede olduğunu (veya daha şanslı olduğunu, GAC'da olduğunu) biliyorsanız, bu yardımcı olabilir ...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

Referans: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.