.net2.0에서 응용 프로그램의 GUID를 프로그래밍 방식으로 가져 오는 방법


100

C # .NET2.0에서 내 프로젝트의 어셈블리에 액세스해야합니다.

프로젝트 속성 아래의 '어셈블리 정보'대화 상자에서 GUID를 볼 수 있으며 현재 코드의 const에 복사했습니다. GUID는 절대 변경되지 않으므로 솔루션이 그렇게 나쁘지는 않지만 직접 액세스하는 것이 좋습니다. 이 작업을 수행하는 방법이 있습니까?

답변:


152

다음 코드를 시도하십시오. 찾고있는 값은 어셈블리에 연결된 GuidAttribute 인스턴스에 저장됩니다.

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'대신 'AppDomain.CurrentDomain.DomainManager.EntryAssembly'를 사용하는 것은 어떻습니까? 글쎄, 우리는 프로그램 클래스의 이름을 바꿀 수 있지 않습니까?
Kenial

11
다른 사람의 인터넷 검색 시간을 절약하기 위해 GuidAttribute는 System.Runtime.InteropServices 네임 스페이스에 있습니다.
Bryce Wagner

5
@BryceWagner는 ctrl+.당신의 친구입니다
있는 no

@Kenial 나는 System.AppDomain.DomainManager.get returned null.간단한 콘솔 앱을 얻 습니다. Assembly.GetEntryAssembly()선호하는 방법 인 것 같습니다 .
Jesse C. Slicer

11

또 다른 방법은 Marshal.GetTypeLibGuidForAssembly 를 사용하는 것 입니다.

msdn에 따르면 :

어셈블리를 형식 라이브러리로 내 보내면 형식 라이브러리에 LIBID가 할당됩니다. 어셈블리 수준에서 System.Runtime.InteropServices.GuidAttribute를 적용하여 LIBID를 명시 적으로 설정하거나 자동으로 생성 할 수 있습니다. Tlbimp.exe (형식 라이브러리 가져 오기 도구) 도구는 어셈블리 ID를 기반으로 LIBID 값을 계산합니다. GetTypeLibGuid는 특성이 적용된 경우 GuidAttribute와 연결된 LIBID를 반환합니다. 그렇지 않으면 GetTypeLibGuidForAssembly가 계산 된 값을 반환합니다. 또는 GetTypeLibGuid 메서드를 사용하여 기존 형식 라이브러리에서 실제 LIBID를 추출 할 수 있습니다.


나는 F #으로이 작업을 수행 할 수 있었다,이 어셈블리 GUID로 사용자 지정 특성이없는 것 같다
fableal

이 방법은 Assembly.ReflectionOnlyLoad종속 어셈블리가로드되지 않은 경우 에도 작동합니다 .
마틴 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);

AssemblyTitle, AssemblyVersion 등과 같은 것을 읽으려는 경우 GuidAttribute를 다른 특성으로 바꿀 수도 있습니다.

현재 어셈블리를 가져 오는 대신 다른 어셈블리 (Assembly.LoadFrom 및 all)를로드 할 수도 있습니다. 외부 어셈블리의 이러한 속성을 읽어야하는 경우 (예 : 플러그인을로드 할 때)


6
어떤 경우에도 캐스트 결과를 사용하려는 경우 "as"캐스트를 사용하지 마십시오. 캐스트가 실패하면보다 유익한 InvalidCastException 대신 NullReferenceException이 발생하기 때문에 일반적으로 잘못된 스타일입니다. "as"캐스트는 객체가 주어진 유형인지 여부를 모르고있는 경우에만 사용하고자 할 때 사용됩니다. ((GuidAttribute) attribs [0]). Value를 대신 사용하십시오. 다른 유형일 것으로 예상하지 않는 경우 (그렇지 않아야 함)
poizan42

5

다른 사람이 즉시 사용 가능한 예제를 찾는 경우 이전 답변을 기반으로 사용하게 된 것입니다.

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.