Bagaimana cara saya secara terprogram mendapatkan GUID aplikasi di .net2.0

100

Saya perlu mengakses perakitan proyek saya di C # .NET2.0.

Saya dapat melihat GUID dalam dialog 'Informasi Majelis' di bawah properti proyek, dan saat ini saya baru saja menyalinnya ke sebuah const dalam kode. GUID tidak akan pernah berubah, jadi ini bukan solusi yang buruk, tetapi alangkah baiknya untuk mengaksesnya secara langsung. Apakah ada cara untuk melakukan ini?

Nathan
sumber

Jawaban:

152

Coba kode berikut. Nilai yang Anda cari disimpan di instance GuidAttribute yang dilampirkan ke Assembly

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);
}
JaredPar
sumber
4
bagaimana dengan menggunakan 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' daripada 'typeof (Program) .Assembly'? Nah, kita bisa mengubah nama kelas Program, bukan?
Kenial
11
Untuk menghemat beberapa detik Googling orang lain, GuidAttribute ada di namespace System.Runtime.InteropServices.
Bryce Wagner
5
@BryceWagner ctrl+.adalah teman Anda
maks
@Kenial Saya mendapatkan System.AppDomain.DomainManager.get returned null.untuk aplikasi konsol sederhana. Sepertinya Assembly.GetEntryAssembly()cara yang disukai.
Jesse C. Slicer
11

Cara lain adalah dengan menggunakan Marshal.GetTypeLibGuidForAssembly .

Menurut msdn:

Ketika rakitan diekspor ke perpustakaan tipe, perpustakaan tipe diberi LIBID. Anda dapat mengatur LIBID secara eksplisit dengan menerapkan System.Runtime.InteropServices.GuidAttribute di tingkat perakitan, atau dapat dibuat secara otomatis. Alat Tlbimp.exe (Type Library Importer) menghitung nilai LIBID berdasarkan identitas rakitan. GetTypeLibGuid mengembalikan LIBID yang terkait dengan GuidAttribute, jika atribut diterapkan. Jika tidak, GetTypeLibGuidForAssembly mengembalikan nilai yang dihitung. Alternatifnya, Anda dapat menggunakan metode GetTypeLibGuid untuk mengekstrak LIBID sebenarnya dari pustaka tipe yang ada.

andrey.ko
sumber
Saya dapat melakukan ini di F #, tampaknya rakitan tidak memiliki atribut khusus dengan Panduan
fableal
Metode ini bekerja bahkan dengan Assembly.ReflectionOnlyLoaddan bahkan ketika rakitan dependen tidak dimuat.
Martin Lottering
Jadi, kode lengkap: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Terlihat jauh lebih sederhana daripada metode lainnya. Apakah ada kerugiannya?
pengguna
7

Atau, semudah:

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

Bekerja untuk saya ...


sumber
6

Anda harus dapat membaca atribut Guid dari assembly melalui refleksi. Ini akan mendapatkan GUID untuk perakitan saat ini

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

Anda juga dapat mengganti GuidAttribute dengan atribut lain, jika Anda ingin membaca hal-hal seperti AssemblyTitle, AssemblyVersion, dll.

Anda juga dapat memuat rakitan lain (Assembly.LoadFrom dan semua) daripada mendapatkan rakitan saat ini - jika Anda perlu membaca atribut rakitan eksternal ini (misalnya - saat memuat plugin)

amazedsaint
sumber
6
Harap jangan gunakan "sebagai" pemeran jika Anda akan menggunakan hasil pemeran apa pun yang terjadi. Ini umumnya gaya yang buruk karena Anda mendapatkan NullReferenceException, bukan InvalidCastException yang lebih informatif jika transmisi gagal. "as" cast adalah untuk saat Anda tidak tahu apakah objek dari tipe yang diberikan dan hanya ingin menggunakannya jika memang benar. Cukup gunakan direct ((GuidAttribute) attribs [0]). Sebagai gantinya, nilai jika Anda tidak mengharapkannya dari jenis lain (yang seharusnya tidak)
poizan42
5

Jika ada orang lain yang mencari contoh kerja di luar kotak, inilah yang akhirnya saya gunakan berdasarkan jawaban sebelumnya.

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

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

Memperbarui:

Karena ini mendapat sedikit perhatian, saya memutuskan untuk memasukkan cara lain untuk melakukannya yang telah saya gunakan. Dengan cara ini Anda dapat menggunakannya dari kelas statis:

    /// <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();
        }
    }
Scott Solmer
sumber
1

Untuk mendapatkan appID Anda dapat menggunakan baris kode berikut:

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

Untuk ini, Anda perlu menyertakan file System.Runtime.InteropServices;

drgmak
sumber
1

Tidak beruntung di sini dengan jawaban lain tetapi berhasil menyelesaikannya dengan satu kalimat yang bagus ini:

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

Semoga ini membantu!

0tombo0
sumber