У меня есть проект, который должен быть скомпилирован и выполнен в режиме на 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 (неприменимый для меня).
Какие-либо другие опции или предложения для лучшего способа приблизиться к моей загадке?
Как вы правильно заметили, не существует способа смешивать разрядность в одном процессе. Вам нужен отдельный процесс для вашей 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 битную.
Нет. Точка. 32-битная dll в 64-битном процессе = нет.
Что я делаю, так это запускаю 32-битный процесс-оболочку и общаюсь с ним с помощью WCF - так же, как и вы. Я могу заставить ОС работать 32 бита.
У меня есть основная библиотека (Tradex.Connectivity.Core) с независимым от платформы кодом .NET. У меня есть две оболочки (Wrapper32.exe, Wapper64.exe), которые запускают и загружают независимый код, а затем загружают класс (управляемый C ++). Работает как шарм.
По сути, это единственный способ для меня - вы не можете загружать 32- и 64-битные элементы с помощью crss.