ฉันจะรับ GUID ของแอปพลิเคชันใน. net2.0 โดยทางโปรแกรมได้อย่างไร


102

ฉันต้องการเข้าถึงแอสเซมบลีของโครงการของฉันใน C # .NET2.0

ฉันเห็น GUID ในกล่องโต้ตอบ 'ข้อมูลการประกอบ' ในคุณสมบัติของโครงการและในขณะนี้ฉันเพิ่งคัดลอกไปยัง const ในรหัส GUID จะไม่มีวันเปลี่ยนแปลงดังนั้นนี่ไม่ใช่วิธีแก้ปัญหาที่เลวร้าย แต่ก็เป็นการดีที่จะเข้าถึงโดยตรง มีวิธีทำไหม?

คำตอบ:


154

ลองใช้รหัสต่อไปนี้ ค่าที่คุณกำลังมองหาจะถูกเก็บไว้ในอินสแตนซ์ GuidAttribute ที่แนบมากับ 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);
}

4
วิธีการใช้ 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' แทน 'typeof (Program) .Assembly' เราจะเปลี่ยนชื่อคลาสโปรแกรมไม่ได้เหรอ
Kenial

11
หากต้องการช่วยคนอื่นไม่กี่วินาทีของ Googling GuidAttribute อยู่ใน namespace System.Runtime.InteropServices
Bryce Wagner

5
@BryceWagner ctrl+.เป็นเพื่อนของคุณ
maxp

@Kenial ฉันได้รับSystem.AppDomain.DomainManager.get returned null.สำหรับแอปคอนโซลง่ายๆ ดูเหมือนAssembly.GetEntryAssembly()จะเป็นวิธีที่ต้องการ
Jesse C. Slicer

11

อีกวิธีหนึ่งคือการใช้Marshal.GetTypeLibGuidForAssembly

ตาม msdn:

เมื่อแอสเซมบลีถูกเอ็กซ์พอร์ตไปยังไลบรารีชนิดไลบรารีชนิดจะถูกกำหนด LIBID คุณสามารถตั้งค่า LIBID อย่างชัดเจนโดยใช้ System.Runtime.InteropServices.GuidAttribute ที่ระดับแอสเซมบลีหรือสามารถสร้างขึ้นโดยอัตโนมัติ เครื่องมือ Tlbimp.exe (Type Library Importer) จะคำนวณค่า LIBID ตามเอกลักษณ์ของแอสเซมบลี GetTypeLibGuid ส่งคืน LIBID ที่เชื่อมโยงกับ GuidAttribute หากใช้แอตทริบิวต์ มิฉะนั้น GetTypeLibGuidForAssembly จะส่งกลับค่าที่คำนวณได้ หรือคุณสามารถใช้เมธอด GetTypeLibGuid เพื่อแยก LIBID จริงจากไลบรารีชนิดที่มีอยู่


ฉันสามารถทำได้ใน F # ดูเหมือนว่าแอสเซมบลีจะไม่มีแอตทริบิวต์ที่กำหนดเองด้วย Guid
fableal

วิธีนี้ใช้ได้แม้Assembly.ReflectionOnlyLoadกระทั่งในขณะที่ไม่ได้โหลดแอสเซมบลีที่อ้างอิง
Martin Lottering

ดังนั้นรหัสเต็มคือ: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). ดูง่ายกว่าวิธีอื่นมาก มีข้อเสียหรือไม่?
ผู้ใช้

7

หรือง่ายเหมือนกัน:

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

ใช้ได้ผลกับฉัน ...


6

คุณควรจะอ่านแอตทริบิวต์ Guid ของชุดประกอบผ่านการสะท้อน สิ่งนี้จะได้รับ GUID สำหรับแอสเซมบลีปัจจุบัน

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

คุณสามารถแทนที่ GuidAttribute ด้วยแอตทริบิวต์อื่น ๆ ได้เช่นกันหากคุณต้องการอ่านสิ่งต่างๆเช่น AssemblyTitle, AssemblyVersion เป็นต้น

คุณยังสามารถโหลดแอสเซมบลีอื่น (Assembly.LoadFrom และทั้งหมด) แทนการรับแอสเซมบลีปัจจุบัน - หากคุณต้องการอ่านแอ็ตทริบิวต์เหล่านี้ของแอสเซมบลีภายนอก (เช่น - เมื่อโหลดปลั๊กอิน)


6
โปรดอย่าใช้การร่าย "เป็น" หากคุณจะใช้ผลของการร่ายไม่ว่าจะเป็นอย่างไร โดยทั่วไปจะเป็นรูปแบบที่ไม่ดีเนื่องจากคุณได้รับ NullReferenceException แทน InvalidCastException ที่ให้ข้อมูลมากกว่าหากการส่งล้มเหลว การร่าย "as" มีไว้สำหรับเมื่อคุณไม่รู้ว่าวัตถุนั้นเป็นประเภทที่กำหนดหรือไม่และต้องการใช้ในกรณีที่เป็นเท่านั้น เพียงแค่ใช้ direct ((GuidAttribute) attribs [0]) แทนค่าหากคุณไม่คิดว่าจะเป็นประเภทอื่น (ซึ่งไม่ควร)
poizan42

6

ในกรณีที่ใครก็ตามที่กำลังมองหาตัวอย่างการทำงานนอกกรอบนี่คือสิ่งที่ฉันใช้ตามคำตอบก่อนหน้านี้

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

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

อัปเดต:

เนื่องจากสิ่งนี้ได้รับความสนใจเล็กน้อยฉันจึงตัดสินใจรวมวิธีอื่นในการทำเช่นนี้ที่ฉันเคยใช้ วิธีนี้ช่วยให้คุณใช้งานได้จากคลาสคงที่:

    /// <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

ในการรับ appID คุณสามารถใช้รหัสบรรทัดต่อไปนี้:

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

สำหรับสิ่งนี้คุณต้องรวมไฟล์ System.Runtime.InteropServices;


1

ไม่มีโชคกับคำตอบอื่น ๆ แต่สามารถหาคำตอบได้ด้วยซับที่ดีนี้:

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

หวังว่านี่จะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.