Способы получить доступ к DLL на 32 бита от 64 битов exe

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

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

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

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

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

13
задан bufferz 10 May 2010 в 17:20
поделиться

2 ответа

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

Я думаю, что хостинг WCF Service - это правильный путь. В вашей ссылке говорится только о 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 битную.

9
ответ дан 2 December 2019 в 00:31
поделиться

Нет. Точка. 32-битная dll в 64-битном процессе = нет.

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

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

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

4
ответ дан 2 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: