Отражение над сборкой x86 из приложения «Любой ЦП» в 64-разрядной ОС - PullRequest
3 голосов
/ 11 июня 2009

У меня есть приложение .Net, которое скомпилировано как «Любой процессор». Я использую его на 64-разрядной ОС, поэтому он работает как 64-разрядный. Приложение загружает другие сборки, которые предоставляет пользователь. Конечно, он использует отражение для чтения типов из предоставленной пользователем сборки. Все работает нормально, если пользовательская сборка скомпилирована как «Любой процессор». Но если сборка скомпилирована как x86, я получаю исключение «это не приложение Win32» во время отражения. Это, очевидно, связано с тем, что хост-приложение работает на 64-битной.

Мой вопрос: как мне обойти это? Есть мысли / идеи?

Спасибо

Ответы [ 3 ]

5 голосов
/ 11 июня 2009

Хорошо. Я понял. Для моих целей, которые были просто обнаружением простого типа для сборки, но без создания экземпляров, использование Assembly.ReflectionOnlyLoad работает, если сборка 32-битная.

Вы загружаете сборку с помощью Assembly.ReflectionOnlyLoad, и вам разрешается размышлять над типами. Вам также следует подключиться к AppDomain.CurrentDomain.ReflectionOnlyLoadResolve.

Чтобы получить имена атрибутов, вам нужно использовать CustomAttributeData.GetCustomAttributes для типа, метода или модуля.

 static void Main(string[] args)
    {
        AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
        Assembly assm = Assembly.ReflectionOnlyLoadFrom("TestProject1.dll");

        Type t = assm.GetType("TestProject1.ProgramTest");
        MethodInfo m = t.GetMethod("MainTest");

        IList<CustomAttributeData> data = CustomAttributeData.GetCustomAttributes(t);


    }

    static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
    {
        return Assembly.ReflectionOnlyLoad(args.Name);
    }
0 голосов
/ 11 июня 2009

Если вам нужно загрузить его только для отражающих целей, вы можете использовать Mono.Cecil , который, я думаю, должен подойти.

В качестве альтернативы возьмите копию библиотеки DLL, запустите corflags к файлу, чтобы перевернуть только 32-битный флаг, а затем загрузите копию.

Первое намного лучше и быстрее для простого отражения, никогда не желая фактически создавать тип, но по сути больше усилий. Второй - подвержен ошибкам (DLL может зависеть от неуправляемого кода, который при запуске через сканирование отражений не сработает, несмотря ни на что.

В качестве третьего альтернативного варианта, чтобы обойти проблему. Просто заставьте ваше приложение работать только как 32-битное, тогда оно должно загружать все просто отлично. Вы действительно должны работать в 64-битном режиме?

0 голосов
/ 11 июня 2009

Вы можете скопировать файл и изменить бит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...