Создание динамического перечисления и попытка сослаться на него не удастся с помощью BindingFailure - PullRequest
3 голосов
/ 06 октября 2009

Мне нужно создать динамическое перечисление, а затем быть в состоянии получить тип с помощью Type.GetType (). Возможно ли это?

Приведенный ниже код создаст динамическое перечисление и попытается использовать его подходящее имя. Это нормально, если я сначала сохраню сборку (используя AssemblyBuilderAccess.RunAndSave). Однако это невозможно, если я использую только AssemblyBuilderAccess.Run; возникает ошибка BindingFailure; не удалось найти сборку. У меня сложилось впечатление, что опция «Выполнить» позволит создавать и использовать без фактического сохранения сборки (или без доступа к различным сборщикам).

(Примечание. Использование кода 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 ]

2 голосов
/ 22 октября 2012

Это фактически задокументировано на MSDN сейчас:

GetType работает только на сборках, загруженных с диска. Если вы звоните GetType чтобы найти тип, определенный в динамической сборке, определенной с помощью Сервисы System.Reflection.Emit могут привести к противоречивому поведению. Поведение зависит от того, является ли динамическая сборка постоянной, то есть созданные с использованием режимов доступа RunAndSave или Save Перечисление System.Reflection.Emit.AssemblyBuilderAccess. [...] Если сборка не была сохранена на диск при вызове метода GetType, метод возвращает ноль GetType не понимает переходную динамику собрания; поэтому, вызывая GetType для получения типа в переходная динамическая сборка возвращает ноль.

Затем документы продолжают, сказав, что вы можете подписаться на AppDomain.AssemblyResolve для разрешения динамической сборки.

0 голосов
/ 06 октября 2009

Я не понимаю, что вы пытаетесь делать там. Две проблемы: 1) вторая строка просто пытается снова получить ссылку на тип, который будет такой же, как и первая строка; это не экземпляр, который вы получаете. 2) IIRC, AssemblyQualifiedName является нулевым для типа / сборки в памяти.

-Oisin

...