4

私はこの分野の経験があまりないので、いくつか質問があります。まず、.Netで作成されたすべてのDLLに独自のGUIDがありますか?そうでない場合、私の質問は、どのようにして1つを取得し、それをDLLに関連付けるかです。

次に、問題は、そのdllのGUIDを取得するにはどうすればよいかということです。DLLパス(c:\ some \ path \ to \ a \ file.dll)が与えられた場合、そのGUIDを決定するにはどうすればよいですか?また、他の方法に進む簡単な方法はありますか(GUID-> DLL)-これについて少し読んだことがありますが、その多くはVB6DLLやCOM関連のものを参照しています...これは.NetDLLにも当てはまりますか?

更新:回答ありがとうございます。たぶん私は間違った質問をしているのでしょう。データベースでそれらを参照できるように、DLLファイルごとに一意のIDが必要です。データベースに保存されている一意のIDを取得して、DLLを簡単に見つけて、それを使って何かを実行できるようにしたいと思います。回答によると、GUIDを使用するべきではないかもしれませんが、これを行うための.Netの方法はありますか?

4

5 に答える 5

4

マネージ アセンブリと COM コンポーネントの間で混乱している可能性があると思います。COM は GUID を使用して、コンポーネントとインターフェイスをクラス ID (CLSID) とインターフェイス ID (IID) の形式で識別します。情報はレジストリに格納され、COM オブジェクト インスタンスの作成に使用されます。.Net は、このメカニズムを使用してアセンブリとクラスを識別しません。似たような登録の状況は、アセンブリが厳密な名前でGACに保存されている場合です。GUIDが.Net で使用される場所はいくつかあります(COM 相互運用機能を含む) が、アセンブリの識別はその 1 つではありません。

于 2009-01-28T22:48:22.993 に答える
2

[assembly: Guid("...")] 属性は通常、AssemblyInfo.cs ファイルで定義されます。既定では、新しいプロジェクトを作成すると、Visual Studio によって Guid が自動的に提供されますが、これが実際に役立つのは、アセンブリを COM に公開する場合のみです。.NET Framework 自体は、アセンブリの読み込み方法やアセンブリとの対話方法を決定するために、この値を使用しません。

于 2009-01-28T22:49:34.160 に答える
0

Visual Studioユーザーは、アセンブリGUIDが定義されているAssemblyInfo.csを確認してください。 [assembly: Guid("abc...")]

于 2009-01-28T22:38:40.580 に答える
0

私たちが尋ねなければならない質問は、なぜアセンブリに GUID が必要だと思うのですか? COM で使用可能でない限り、GUID でロードしたり、CLSID を登録したりしません。

于 2009-01-28T22:46:30.253 に答える
0

2 番目の質問 (Guid -> アセンブリ) に答えるには、dll が既に読み込まれていて、どれが GUID を持っているか (存在する場合) を見つけたいだけであれば、これは簡単です。

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

static Assembly FindAssemblyForGuid(Guid match)
{
    foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
    {
        object[]  attributes = a.GetCustomAttributes(typeof(GuidAttribute)) ;
        if ( attributes.Length > 0 ) 
        {
            foreach (GuidAttribute g in attributes )
            {
                if (g.Value == match)
                    return a;
            }
        }
    }
    return null; // failed to find it
}

ロードせずに実行したい場合は、一時的なアプリ ドメインにロードして確認し、アプリ ドメインをドロップするか、アンマネージド イントロスペクション API を使用して同じことを行う必要がありますが、後で何も解放する必要はありません。 .

于 2009-01-28T22:52:58.100 に答える