如果Type.GetType(字符串)了解动态生成的类型?(Should Type.GetType(

2019-09-17 18:35发布

我有创建使用的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");
    }
}

Answer 1:

请参阅备注部分MSDN 。 你想要做什么,不支持:

的GetType仅适用于从磁盘加载的程序集。 如果你打电话的GetType来查找使用System.Reflection.Emit服务定义的动态集中定义的类型,你可能会得到不一致的行为。 这种行为取决于动态装配是否持久,也就是使用System.Reflection.Emit.AssemblyBuilderAccess枚举的RunAndSave或保存访问模式创建的。 如果动态组件是持久性的,并已写入磁盘的GetType调用之前,装载机发现在磁盘上保存的组件,加载该程序集,并检索从装配型。 如果装配尚未保存到磁盘时的GetType被调用时,该方法返回null。 的GetType不明白瞬态动力组件; 因此,调用的GetType在短暂的动态组装检索式返回null。



文章来源: Should Type.GetType(string) be aware of dynamically generated types?