.Net2.0'da bir uygulamanın GUID'sini programlı olarak nasıl alırım


100

C # .NET2.0'da projemin derlemesine erişmem gerekiyor.

GUID'i proje özellikleri altındaki 'Montaj Bilgileri' iletişim kutusunda görebiliyorum ve şu anda koddaki bir const'a kopyaladım. GUID asla değişmeyecek, bu yüzden bu bir çözüm için o kadar da kötü değil, ancak ona doğrudan erişmek güzel olurdu. Bunu yapmanın bir yolu var mı?

Yanıtlar:


152

Aşağıdaki kodu deneyin. Aradığınız değer, Montaja eklenmiş bir GuidAttribute örneğinde saklanır

using System.Runtime.InteropServices;

static void Main(string[] args)
{
    var assembly = typeof(Program).Assembly;
    var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
    var id = attribute.Value;
    Console.WriteLine(id);
}

4
'typeof (Program) .Assembly' yerine 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' kullanmaya ne dersiniz? Peki, Program sınıfının adını değiştirebiliriz, değil mi?
Kenial

11
GuidAttribute, başka birisine birkaç saniye Googling'i kaydetmek için System.Runtime.InteropServices ad alanı içindedir.
Bryce Wagner

5
@BryceWagner ctrl+.senin arkadaşın
maxp

@Kenial System.AppDomain.DomainManager.get returned null.Basit bir konsol uygulaması alıyorum . Görünüşe göre Assembly.GetEntryAssembly()tercih edilen yol bu.
Jesse C. Slicer

11

Başka bir yol da Marshal.GetTypeLibGuidForAssembly kullanmaktır .

Msdn'ye göre:

Montajlar tip kitaplıklarına dışa aktarıldığında, tip kitaplığına bir LIBID atanır. Montaj düzeyinde System.Runtime.InteropServices.GuidAttribute uygulayarak LIBID'yi açıkça ayarlayabilirsiniz veya otomatik olarak oluşturulabilir. Tlbimp.exe (Tür Kitaplığı İçe Aktarıcı) aracı, montajın kimliğine bağlı olarak bir LIBID değeri hesaplar. GetTypeLibGuid, öznitelik uygulanırsa, GuidAttribute ile ilişkili LIBID'yi döndürür. Aksi takdirde, GetTypeLibGuidForAssembly hesaplanan değeri döndürür. Alternatif olarak, gerçek LIBID'yi mevcut bir tür kitaplığından çıkarmak için GetTypeLibGuid yöntemini kullanabilirsiniz.


Bunu F # ile yapabildim, görünüşe göre montajın Guid ile özel bir özniteliği yok
fableal

Bu yöntem Assembly.ReflectionOnlyLoad, bağımlı derlemeler yüklenmediğinde bile çalışır .
Martin Lottering

Yani, tam kodudur: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Diğer yöntemden çok daha basit görünüyor. Herhangi bir dezavantaj var mı?
kullanıcı

7

Ya da bu kadar kolay:

string assyGuid = Assembly.GetExecutingAssembly().GetCustomAttribute<GuidAttribute>().Value.ToUpper();

Benim için çalışıyor...


6

Montajın Kılavuz niteliğini yansıma yoluyla okuyabilmelisiniz. Bu, mevcut derleme için GUID'yi alacak

         Assembly asm = Assembly.GetExecutingAssembly();
        var attribs = (asm.GetCustomAttributes(typeof(GuidAttribute), true));
        Console.WriteLine((attribs[0] as GuidAttribute).Value);

AssemblyTitle, AssemblyVersion vb. Şeyleri okumak istiyorsanız, GuidAttribute öğesini diğer özniteliklerle de değiştirebilirsiniz.

Mevcut montajı almak yerine başka bir montaj da (Assembly.LoadFrom ve tümü) yükleyebilirsiniz - eğer harici montajların bu niteliklerini okumanız gerekiyorsa (örneğin - bir eklenti yüklerken)


6
Ne olursa olsun dökümün sonucunu kullanacaksanız lütfen "as" kullanmayınız. Genelde kötü bir stildir, çünkü döküm başarısız olursa daha bilgilendirici InvalidCastException yerine bir NullReferenceException alırsınız. "as" yayınları, nesnenin belirtilen türde olup olmadığını bilmediğiniz ve yalnızca olması durumunda kullanmak istediğiniz zamanlar içindir. Sadece doğrudan ((GuidAttribute) öznitelikleri [0]) kullanın. Bunun yerine, başka bir türde olmasını beklemiyorsanız (ki olmamalıdır) değer
poizan42

5

Başka birinin kutunun dışında bir çalışma örneği araması durumunda, önceki cevaplara dayanarak kullandığım şey bu.

using System.Reflection;
using System.Runtime.InteropServices;

label1.Text = "GUID: " + ((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute), false)).Value.ToUpper();

Güncelleme:

Bu biraz dikkat çektiğinden, kullanmakta olduğum başka bir yöntem eklemeye karar verdim. Bu yol, onu statik bir sınıftan kullanmanıza izin verir:

    /// <summary>
    /// public GUID property for use in static class </summary>
    /// <returns> 
    /// Returns the application GUID or "" if unable to get it. </returns>
    static public string AssemblyGuid
    {
        get
        {
            object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false);
            if (attributes.Length == 0) { return String.Empty; }
            return ((System.Runtime.InteropServices.GuidAttribute)attributes[0]).Value.ToUpper();
        }
    }

1

Uygulama kimliğini almak için aşağıdaki kod satırını kullanabilirsiniz:

var applicationId = ((GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;

Bunun için eklemeniz gerekir System.Runtime.InteropServices;


1

Burada diğer cevaplarla şansınız yaver gitmedi ama bu güzel tek satırla bunu çözmeyi başardım:

((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value

Bu yardımcı olur umarım!

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.