web-dev-qa-db-ja.com

.net2.0のアプリケーションのGUIDをプログラムで取得する方法

C#.NET2.0でプロジェクトのアセンブリにアクセスする必要があります。

GUIDは、プロジェクトのプロパティの下にある[アセンブリ情報]ダイアログで確認できますが、現時点では、コードのconstにコピーしました。GUIDは変わらないので、これはそれほど悪い解決策ではありませんが、直接アクセスするのは良いことです。これを行う方法はありますか?

41
Nathan

次のコードを試してください。探している値は、アセンブリにアタッチされた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);
}
64
JaredPar

編集:ダウン投票を主張する人に...この回答は受け入れられているため、削除できません。したがって、正しい答えを含めるように編集しています( JaredPar's code below)

実行アセンブリのみを取得する場合は十分に簡単です。

using System.Reflection;

Assembly assembly = Assembly.GetExecutingAssembly();

//The following line (part of the original answer) is misleading.
//**Do not** use it unless you want to return the System.Reflection.Assembly type's GUID.
Console.WriteLine(Assembly.GetType().GUID.ToString());


// The following is the correct code.
var attribute = (GuidAttribute)Assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
var id = attribute.Value;
32
Cerebrus

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

Msdnによると:

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

10
andrey.ko

リフレクションを介してアセンブリの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およびすべて)をロードすることもできます-外部アセンブリのこれらの属性を読み取る必要がある場合(例-プラグインのロード時)

6
amazedsaint

他の誰かがすぐに使用できるサンプルを探している場合、これは以前の回答に基づいて使用したものです。

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();
        }
    }
5
Okuma.Scott

または、同じくらい簡単:

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

私のために働く...

2
user3089358

AppIDを取得するには、次のコード行を使用できます。

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

このためには、System.Runtime.InteropServices;を含める必要があります

2
drgmak