2010-11-18 9 views
8

明白なことがありませんが、Reflection.Emitで新しいタイプを作成した場合、どのような名前空間を指定する必要がありますか?すなわちReflection.Emitで作成した型の名前空間を指定する方法は?

..

AssemblyName assemblyName = new AssemblyName(); 
assemblyName.Name = "TestDynamic"; 

AssemblyBuilder assemblyBuilder = 
    AppDomain.CurrentDomain.DefineDynamicAssembly(
     assemblyName, 
     AssemblyBuilderAccess.Save); 

ModuleBuilder moduleBuilder =  
    AssemblyBuilder.DefineDynamicModule("TestDynamic", "TestDynamic.dll"); 

TypeBuilder myTestInterface = 
    moduleBuilder.DefineType("MyTestInterface", 
    TypeAttributes.Public | TypeAttributes.Interface, typeof(object)); 

にはどうすればの名前空間を与えていますか?

答えて

11

あなたがタイプ定義する場所を定義します。

moduleBuilder.DefineType("MyNamespace.MyTestInterface", 
       TypeAttributes.Public | TypeAttributes.Interface, 
       typeof(object)); 
+0

D'oh!私はそれが何か明白でなければならないことを知っていた。ありがとう。 –

0

ただ、「短い」型名の前にそれを置くが。 "Namespace.Subnamespace.Type"

+0

これは単純に真実ではありませんが、型はスコープ(アセンブリ、モジュール、または型がネストされている場合は別の型)、名前空間、名前で識別されます。 –

+0

アセンブリを追加するのを忘れてしまった。それでも、CLRは私が知る限り名前空間について何も知らない。 – Botz3000

+0

ECMA-335は、タイプがそれぞれのアセンブリの範囲内でフルネームで識別されることを指定します。これらのフルネームは、名前空間と名前で構成されたタイプのメタデータから構成され、2つの異なるエンティティとして格納されます。それは何も知らないとはかなり違っています。 SREの場合、実装は、ECMA 335で編集された単純なルール(最後のドットで分割)に基づいてフルネームを分割します。 –