Способы доступа к 32-битной DLL из 64-битного exe - PullRequest
13 голосов
/ 10 мая 2010

У меня есть проект, который необходимо скомпилировать и запустить в 64-битном режиме. К сожалению, я обязан вызывать DLL, которая доступна только в 32-битном режиме, поэтому я никак не могу разместить все в одном проекте Visual Studio. Я работаю над тем, чтобы найти лучший способ обернуть 32-битную DLL в собственную exe / службу и выполнить удаленные (хотя и на той же машине) вызовы этой exe / service из моего 64-битного приложения. Моя ОС - Win7 Pro 64 bit.

Требуемые вызовы этого 32-битного процесса - несколько десятков в секунду, но небольшой объем данных. Это приложение для анализа изображений в реальном времени, поэтому время отклика имеет решающее значение, несмотря на небольшой объем. Много отправки / получения отдельных примитивов.

В идеале, я бы разместил службу WCF для размещения этой DLL, но в 64-битной ОС нельзя заставить службу работать как x86! Источник . Это действительно прискорбно, так как я рассчитал время вызова функции для службы WCF на моей машине всего 4 мс.

Я экспериментировал с именованными каналами .net. Я обнаружил, что они в 40-50 раз медленнее, чем WCF (для меня это непригодно).

Какие-нибудь другие варианты или предложения для лучшего подхода к моей загадке?

Ответы [ 3 ]

9 голосов
/ 10 мая 2010

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

Я думаю, что размещение службы WCF - правильный путь.Ваша ссылка говорит только о wcfsvchost.Я почти уверен, что вы можете создать свою собственную службу Windows и разместить в ней службу WCF на 32-битной.

См. Эту ссылку: Как разместить службу WCF в управляемом приложении .Вы можете разместить свою службу в любом управляемом приложении, включая службу Windows, и запускать ее с нужной вам разрядностью.

Это количество кода, необходимое для самостоятельного размещения службы WCF в вашем приложении, при условии, что вытолько что создали новый сервис под названием MyService, и в app.config была добавлена ​​соответствующая конфигурация:

class Program
{
    static void Main(string[] args)
    {
        using(ServiceHost host = new ServiceHost(typeof(MyService), new Uri[0]))
        {
            host.Open();
            Console.ReadKey();    
        }
    }
}

Вышеупомянутая программа также будет работать, даже если вы явно скомпилируете ее как 32- или 64-битную.

4 голосов
/ 10 мая 2010

Отсутствует. Точка. 32-битная DLL в 64-битном процессе = нет хода.

Я запускаю 32-битный процесс-обертку и общаюсь с ним с помощью WCF - так же, как вы. Я могу заставить ОС работать 32 бит.

У меня есть базовая библиотека (Tradex.Connectivity.Core) с независимым от платформы кодом .NET. У меня есть две оболочки (Wrapper32.exe, Wapper64.exe), которые запускают и загружают независимый код, а затем загружают класс (управляемый C ++). Работает как шарм.

Это единственный способ для меня - вы не можете загрузить 32- и 64-битные элементы.

1 голос
/ 01 марта 2016

Я знаю, что этот ответ может быть немного запоздалым, но некоторое время назад я столкнулся с точно такой же проблемой (загрузка 32-битной библиотеки DLL в сборку AnyCPU на 64-битной машине).

В качестве решения я написал LegacyWrapper . В основном он состоит из 32-битной исполняемой оболочки, загружающей желаемую dll и связывающейся с вашим приложением через Named Pipes.

Звонок будет выглядеть так:

// Define delegate matching api function
private delegate int GetSystemMetrics(int index);

// Create new WrapperClient
// Remember to ensure a call to the Dispose()-Method!
using (var client = new WrapperClient())
{
    // Make calls providing library name, function name, and parameters
    int x = (int)client.Invoke<GetSystemMetrics>("User32.dll", "GetSystemMetrics", new object[] { 0 });
    int y = (int)client.Invoke<GetSystemMetrics>("User32.dll", "GetSystemMetrics", new object[] { 1 });
}

За некоторыми подробностями вы можете обратиться к этому сообщению в блоге .

Редактировать: Начиная с версии 2.1, LegacyWrapper также поддерживает загрузку 64-битных DLL из 32-битного процесса.

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