web-dev-qa-db-ja.com

アセンブリの名前空間を取得する方法は?

私は次のコードを使用してロードしたアセンブリ(クラスライブラリdll)を持っていると考えてください、

Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");   

そして、私はアセンブリのタイプを取得する必要があります。 typeを取得するには、アセンブリの名前空間が必要です。

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             

上記の行で名前空間を取得するにはどうすればよいですか?! Namespaceを取得するために、型を取得する必要があります。

Type.Namespace;

つまり、タイプを取得するために使用できるアセンブリの名前空間を取得する必要があります。

前もって感謝します

31
SyncMaster

Assembly.GetTypes()を使用します。これにより、すべての型のコレクションが取得され、各型の名前空間プロパティを取得できます。

次に、すべての型が同じ名前空間値を持っていることを確認し、この値を使用できると思います。そうでない場合は、他のロジックを追加して、プライマリと見なす名前空間を検出します。

34
sharptooth

アセンブリには、複数の名前空間を含めることができます。名前空間を指定せずに、アセンブリから型を取得する方法が本当に欲しいと思います。

より良い方法があるかどうかはわかりませんが、次のような特定のタイプを探してみてください(add-using linq;):

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

これは、異なる名前空間にその名前のクラスが複数ある場合に効果的にスローされます(Singleメソッドは1つだけであることを保証するため)。

そのクラスの名前空間のリストについては、次のことができます。

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
22
eglasius

更新済み:

[〜#〜] if [〜#〜] the Assembly nameAssembly namespaceはプロジェクト内で同じであり、テーマは必ず同じにします[〜#〜] and [〜#〜]の名前空間を取得したい現在実行されているアセンブリthenこれを使用できます:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

そして、ロードされたアセンブリの場合:

var namespace = myAssembly.GetName().Name;

しかし[〜#〜] if [〜#〜] the Assembly nameAssembly namespaceではないプロジェクトで同じ場合、この方法を使用できます。

// Like @eglasius answer >>
// Find all namespaces in the target Assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();
15
RAM

Mono/Xamarinを使用すると、「NameSpace」プロパティにアクセスできません。代わりに次を使用できます。

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
1
Jean

Assembly.GetName().Nameはデフォルトの名前空間を取得します

0
Lance H

アセンブリにほぼクラス(またはインターフェイスなどの他のタイプ)が含まれている必要があり、アセンブリは名前空間に含まれている必要があります。名前空間はAssembly名前空間内で開始する必要があります。

だから、ここに私が見つけた解決策があります:

public string GetAssemblyNamespace(Assembly asm)
{
    string ns = @"";
    foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified Assembly.
        if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that's the shortest so far.
            ns = tp.Namespace; //If it's, set it to the variable.
    return ns; //Now it is the namespace of the Assembly.
}

必要なアセンブリ内のすべてのタイプを見つけ、最も短い名前を持つネームスペースに含まれるタイプを検索します。

0
Davide Cannizzo

名前空間のみを取得するには、次のコードに従います。

  var Assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the Assembly object
  var nameSpace = Assembly.GetType().Namespace;//Get the namespace

[〜#〜] or [〜#〜]

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}
0
Tiago S