プログラムで.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」を使用するのはどうですか?ええと、Programクラスの名前を変更できますね。
ケニア

11
グーグルの数秒で他の人を救うために、GuidAttributeは名前空間System.Runtime.InteropServicesにあります。
ブライスワーグナー

5
@BryceWagner ctrl+.はあなたの友達です
maxp

@Kenial System.AppDomain.DomainManager.get returned null.シンプルなコンソールアプリを取得します。のように思われるAssembly.GetEntryAssembly()が好ましい方法です。
ジェシーC.スライサー

11

別の方法は、Marshal.GetTypeLibGuidForAssemblyを使用することです。

msdnによると:

アセンブリがタイプライブラリにエクスポートされると、タイプライブラリにはLIBIDが割り当てられます。System.Runtime.InteropServices.GuidAttributeをアセンブリレベルで適用することにより、LIBIDを明示的に設定することも、自動的に生成することもできます。Tlbimp.exe(タイプライブラリインポーター)ツールは、アセンブリのIDに基づいてLIBID値を計算します。GetTypeLibGuidは、属性が適用されている場合、GuidAttributeに関連付けられているLIBIDを返します。それ以外の場合、GetTypeLibGuidForAssemblyは計算された値を返します。または、GetTypeLibGuidメソッドを使用して、既存のタイプライブラリから実際のLIBIDを抽出することもできます。


私はF#でこれを行うことができました。アセンブリにGuidのカスタム属性がないようです
寓話

この方法Assembly.ReflectionOnlyLoadは、依存アセンブリが読み込まれていない場合でも機能します。
Martin Lottering、2015

したがって、完全なコードは次のとおり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"キャストは、オブジェクトが指定されたタイプであるかどうかがわからない場合に使用します。別のタイプであると
予期

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

ここでは他の答えでは運がありませんが、この素敵な1つのライナーでうまく対処できました:

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

お役に立てれば!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.