3

CodeDom コンパイラを使用してコードを作成するアプリがあります。生成されたアセンブリがメモリ内にあることがわかります。しかし、Type.GetType(typeName) を呼び出すと、null が返されます。これは少し紛らわしいと思います。

私は何を間違っていますか?

static void Main(string[] args)
{
    // FYI: Code is some dummy class with only 1 instance method.
    string code = System.IO.File.ReadAllText("CodeToCompile.cs.txt");

    string errors = null;
    Assembly asm = DynamicCompiler.Compile(code, generateInMemory: true, generateDebugInfo: false, message: ref errors);

    // Get type from the generated assembly. We know there is only one.
    Type oneAndOnlyTypeInAssembly = asm.GetTypes().First();

    string typeName = oneAndOnlyTypeInAssembly.AssemblyQualifiedName;

    // Tell the type system to return instance of type based on fully qualified name.
    // I'd expect this to work, since the assembly is already loaded to memory.
    Type sameType = Type.GetType(typeName);

    if (sameType != null)
    {
        Console.WriteLine("Type found and equal={0}", oneAndOnlyTypeInAssembly.Equals(sameType));
    }
    else
    {
        Console.WriteLine("Type NOT FOUND");
    }
}
4

1 に答える 1

12

MSDNの備考セクションを参照してください。あなたがしたいことはサポートされていません:

GetType は、ディスクから読み込まれたアセンブリに対してのみ機能します。GetType を呼び出して、System.Reflection.Emit サービスを使用して定義された動的アセンブリで定義された型を検索すると、一貫性のない動作が発生する可能性があります。動作は、動的アセンブリが永続的であるかどうか、つまり、System.Reflection.Emit.AssemblyBuilderAccess 列挙体の RunAndSave または Save アクセス モードを使用して作成されているかどうかによって異なります。動的アセンブリが永続的で、GetType が呼び出される前にディスクに書き込まれている場合、ローダーはディスク上に保存されているアセンブリを見つけ、そのアセンブリを読み込み、そのアセンブリから型を取得します。GetType が呼び出されたときにアセンブリがディスクに保存されていない場合、メソッドは null を返します。GetType は一時的な動的アセンブリを認識しません。したがって、一時的な動的アセンブリで GetType を呼び出して型を取得すると、 null が返されます

于 2012-06-04T20:09:40.047 に答える