使用BindingFailure创建动态枚举并尝试引用它失败

时间:2009-10-06 15:08:53

标签: c# reflection enums reflection.emit

我需要创建一个动态枚举,然后能够使用Type.GetType()获取该类型。这可能吗?

下面的代码将创建一个动态枚举,并尝试使用它的限定名称。如果我第一次存储程序集(使用AssemblyBuilderAccess.RunAndSave),这很好。但是,如果我只使用AssemblyBuilderAccess.Run,​​这是不可能的;发生BindingFailure错误;无法找到装配。我的印象是Run选项允许创建和使用,而无需实际存储程序集(或访问不同的Builders)。

(注意:Type.GetType()的以下代码用法不是我的。我无法更改该代码。)

如何在不存储程序集的情况下创建动态枚举并引用它?

        private Type CreateType()
        {          
        // Define the assembly.
        System.Reflection.Emit.AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new System.Reflection.AssemblyName("temporaryAssembly"), AssemblyBuilderAccess.Run);

        // Actually create it.
        System.Reflection.Emit.ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("temporaryAssembly");

        // Create the enum.
        System.Reflection.Emit.EnumBuilder enumBuilder = moduleBuilder.DefineEnum("Temp", System.Reflection.TypeAttributes.Public, typeof(int));

        /* Populate the enum. */

                    return enumBuilder.CreateType();
        }

        private void DoStuff()
        {
                    Type t = CreateType();
                    Type createAnotherOfSameType = Type.GetType(t.AssemblyQualifiedName);
        }/

2 个答案:

答案 0 :(得分:2)

现在实际记录在MSDN上:

  

GetType仅适用于从磁盘加载的程序集。如果你调用GetType   查找使用。定义的动态程序集中定义的类型   System.Reflection.Emit服务,您可能会得到不一致的行为。   行为取决于动态程序集是否持久,   也就是说,使用RunAndSave创建或保存访问模式   System.Reflection.Emit.AssemblyBuilderAccess枚举。 [...]如果   调用GetType时,程序集尚未保存到磁盘   返回null。 GetType不了解瞬态动态   组件;因此,调用GetType来检索a中的类型   瞬态动态程序集返回null。

然后,文档继续说您可以订阅AppDomain.AssemblyResolve来解析动态程序集。

答案 1 :(得分:0)

我不明白你在那里做什么。两个问题:1)第二行只是试图再次获得对Type的引用,这将是与第一行相同的引用;这不是你得到的实例。 2)IIRC,对于内存类型/程序集,AssemblyQualifiedName为null。

-Oisin