Làm cách nào để lấy GUID của một ứng dụng trong .net2.0 theo chương trình


100

Tôi cần truy cập vào assembly của dự án của mình trong C # .NET2.0.

Tôi có thể thấy GUID trong hộp thoại 'Assembly Information' trong thuộc tính của dự án và hiện tại tôi vừa sao chép nó vào một const trong mã. GUID sẽ không bao giờ thay đổi, vì vậy đây không phải là một giải pháp tồi, nhưng sẽ rất tốt nếu bạn truy cập trực tiếp vào nó. Có cách nào để làm việc này không?

Câu trả lời:


152

Hãy thử đoạn mã sau. Giá trị bạn đang tìm kiếm được lưu trữ trên một phiên bản GuidAttribute được đính kèm với 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
còn việc sử dụng 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' thay vì 'typeof (Program) .Assembly' thì sao? tốt, chúng ta có thể thay đổi tên của lớp Chương trình, phải không?
Kenial 22/10/12

11
Để tiết kiệm cho người khác vài giây sử dụng Google, GuidAttribute nằm trong không gian tên System.Runtime.InteropServices.
Bryce Wagner

5
@BryceWagner ctrl+.là bạn của bạn
maxp

@Kenial Tôi nhận được System.AppDomain.DomainManager.get returned null.một ứng dụng bảng điều khiển đơn giản. Có vẻ như Assembly.GetEntryAssembly()là cách ưa thích.
Jesse C. Slicer

11

Một cách khác là sử dụng Marshal.GetTypeLibGuidForAssembly .

Theo msdn:

Khi các tập hợp được xuất sang các thư viện kiểu, thư viện kiểu sẽ được gán LIBID. Bạn có thể đặt LIBID một cách rõ ràng bằng cách áp dụng System.Runtime.InteropServices.GuidAttribute ở cấp độ lắp ráp hoặc nó có thể được tạo tự động. Công cụ Tlbimp.exe (Nhập Thư viện Loại) tính toán một giá trị LIBID dựa trên danh tính của hợp ngữ. GetTypeLibGuid trả về LIBID được liên kết với GuidAttribute, nếu thuộc tính này được áp dụng. Nếu không, GetTypeLibGuidForAssembly trả về giá trị được tính toán. Ngoài ra, bạn có thể sử dụng phương thức GetTypeLibGuid để trích xuất LIBID thực từ thư viện loại hiện có.


Tôi đã có thể thực hiện việc này trong F #, có vẻ như hội đồng không có thuộc tính tùy chỉnh với Hướng dẫn
fableal

Phương pháp này hoạt động ngay cả với Assembly.ReflectionOnlyLoadvà ngay cả khi các cụm phụ thuộc không được tải.
Martin Lottering

Vì vậy, các mã đầy đủ là: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Trông đơn giản hơn nhiều so với phương pháp khác. Có bất kỳ nhược điểm nào không?
người dùng

7

Hoặc, chỉ cần dễ dàng:

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

Làm việc cho tôi ...


6

Bạn sẽ có thể đọc thuộc tính Guid của assembly thông qua phản chiếu. Điều này sẽ nhận được GUID cho hội hiện tại

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

Bạn cũng có thể thay thế GuidAttribute bằng các thuộc tính khác, nếu bạn muốn đọc những thứ như AssemblyTitle, AssemblyVersion, v.v.

Bạn cũng có thể tải một lắp ráp khác (Assembly.LoadFrom và tất cả) thay vì tải lắp ráp hiện tại - nếu bạn cần đọc các thuộc tính này của các hợp ngữ bên ngoài (ví dụ - khi tải một plugin)


6
Vui lòng không sử dụng cast "as" nếu bạn định sử dụng kết quả của cast bất kể điều gì. Nói chung là kiểu xấu vì bạn nhận được NullReferenceException thay vì InvalidCastException nhiều thông tin hơn nếu quá trình truyền không thành công. phôi "as" dành cho khi bạn không biết đối tượng có thuộc loại đã cho hay không và chỉ muốn sử dụng nó trong trường hợp có. Chỉ cần sử dụng một trực tiếp ((GuidAttribute) attribs [0]) Giá trị thay vì nếu bạn không mong đợi nó sẽ loại khác (mà nó không nên).
poizan42

5

Trong trường hợp bất kỳ ai khác đang tìm kiếm một ví dụ làm việc ngoài hộp, đây là những gì tôi đã kết thúc bằng cách sử dụng dựa trên các câu trả lời trước đó.

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

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

Cập nhật:

Vì điều này đã thu hút được một chút chú ý nên tôi quyết định đưa vào một cách thực hiện khác mà tôi đang sử dụng. Cách này cho phép bạn sử dụng nó từ một lớp tĩnh:

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

Để có được appID, bạn có thể sử dụng dòng mã sau:

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

Đối với điều này, bạn cần phải bao gồm System.Runtime.InteropServices;


1

Không có may mắn ở đây với các câu trả lời khác nhưng đã cố gắng giải quyết nó với một lớp lót tốt đẹp này:

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

Hi vọng điêu nay co ich!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.