Вызов метода внутри .NET 32-bit dll из .NET 64-bit exe с использованием отражения - PullRequest
3 голосов
/ 05 октября 2010

У меня есть 32-битная библиотека классов .NET, имеющая простой публичный класс и простой публичный метод.У меня 64-битное консольное приложение .NET, в котором с помощью отражения я хочу загрузить 32-битную сборку и использовать ее метод.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Host.TestLib;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var lib = Assembly.LoadFrom("Simple32bitAssembly.dll");
        }
    }
}

При запуске этого файла выдается следующее исключение:

System.BadImageFormatException was unhandled
Message=Could not load file or assembly 
'file:///E:\AjitTemp\c\32bit64Bit\ReflectionTest\test\bin\Debug\Simple32bitAssembly.dll' 
or one of its dependencies. An attempt was made to load a program with an incorrect format.

Google предлагает предположить, что мне нужно создать 64-битную оболочку для этой 32-битной библиотеки DLL и загрузить эту оболочку, используя relection, в моем 64-битном консольном приложении?Это путь?Любой пример кода будет очень полезен.

1 Ответ

4 голосов
/ 05 октября 2010

Если вы специально выбрали обе сборки как 32-битную и 64-битную, то вы не можете загрузить 32-битную сборку в 64-битный процесс (и наоборот).

Если возможно, вы можете перестроить 32-битную сборку как «Любой процессор»? Это позволит вам загрузить Simple32bitAssembly в 64-битное консольное приложение.

Что касается вашего комментария:

«Существуют бизнес-ограничения, из-за которых я не могу скомпилировать 32-битную DLL как« Любой ЦП ».»

Единственный способ обойти это - развернуть 32-битную сборку в отдельный 32-битный суррогатный процесс. Этот процесс может предоставлять функциональность с помощью технологий .NET, таких как:

    WCF
    Remoting
    ASP.NET Web Service

Недостатки в том, что межпроцессные вызовы могут быть дорогими (хотя вы можете использовать именованные каналы в WCF или Remoting) и увеличивать сложность вашего приложения.

У вас также больше не будет возможности использовать отражение непосредственно на этом компоненте из приложения-потребителя 64 (но вы можете использовать отражение в суррогате).

Таковы испытания приложений со смешанной архитектурой.

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