web-dev-qa-db-ja.com

.Netで特定のタイプのアセンブリ(System.Reflection.Assembly)を取得する方法は?

.Netで、型名を指定すると、その型が定義されているアセンブリ(System.Reflection.Assemblyのインスタンス)を指定するメソッドがありますか?

私のプロジェクトにはすでにそのアセンブリへの参照があり、どれがそれであるかを知る必要があるだけだと思います。

35

Assembly.GetAssemblyは、その型のインスタンスがあると想定し、Type.GetTypeは、アセンブリ名を含む完全修飾型名があると想定しています。

ベースタイプ名のみがある場合は、次のようにする必要があります。

public static String GetAssemblyNameContainingType(String typeName) 
{
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    {
        Type t = currentassembly.GetType(typeName, false, true);
        if (t != null) {return currentassembly.FullName;}
    }

    return "not found";
}

これは、タイプがルートで宣言されていることも前提としています。名前空間または名前で囲む型を指定するか、同じ方法で繰り返す必要があります。

37
jpj625
Assembly.GetAssembly(typeof(System.Int32))

置換System.Int32必要に応じてどんなタイプでも。 Typeパラメータを受け入れるため、たとえば次のように、ほぼすべてのことができます。

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}
33

受け入れられた答えを自分の目的に合わせて変更し(アセンブリ名の代わりにアセンブリオブジェクトを返す)、VB.NETおよびLINQのコードをリファクタリングしました。

Public Function GetAssemblyForType(typeName As String) As Assembly
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function

他の誰かが受け入れられた答えに対するLINQyソリューションを希望する場合、私はここでそれを共有しています。

3
MCattle
Type.GetType(typeNameString).Assembly
2
John Saunders

使用できる場合、この構文は最短/クリーンです:

typeof(int).Assembly
0
Sam Harwell