2012-02-15 1 views
2

Мне нужно использовать COM-DLL от внешней компании (поэтому у меня нет исходного кода), который работает только с компилятором CPU-Target x86.Используйте 32-битную DLL в 64-битном приложении с .Net 2.0

Но моя программа - это программа «Любой процессор», и я не хочу ее менять.

Итак, я много читал и много писал и выяснил, что мне нужно 2 процесса, которые взаимодействуют с IPC и WCF.

Проблема: WCF недоступен с .Net Framework 2.0.

Итак, какой самый лучший и простой способ сделать это без изменения CPU-Target из моей основной программы?

+0

Почему вы не можете изменить свою основную программу для использования x86? Это ведь архетект, который будет использоваться на 32-битных машинах в любом случае. – Justin

+0

См. Также http://stackoverflow.com/a/12938217/184528 – cdiggins

ответ

3

Если у вас есть dll x86 target, будь то сборка .Net или родная dll, то вы должны разместить эту DLL в 32-разрядном процессе - в случае .Net это означает выбор платформы x86, иначе ваша dll wil не загружается на 64-битную машину.

Если вы абсолютно необходимо иметь 64 битный процесс, когда это возможно, то только ваши реальные средства с помощью этой библиотеки DLL будет создать внешний 32-битный процесс, что «хозяева» Библиотеки DLL и сообщаться с основной 64 разрядного процесса с помощью IPC (межпроцессная связь). WCF - это всего лишь один способ общения между процессами - его недоступно в .Net 2.0, однако вы все равно можете использовать другие методы, такие как .Net remoting.

См Interprocess communication for Windows in C# (.NET 2.0)

Однако все это будет болью для реализации и поддержки - если у Вас нет очень хорошая причина просто компиляции приложения с платформой x86 вместо этого, по крайней мере, пока внешней компании выпустит 64-битная версия.

0

В прошлом я всегда писал .NET-оболочку для библиотек COM и C++ и помещал ее в свою собственную библиотеку классов.

Обертка может обрабатывать все вызовы interop в dll.

Он также позволяет выполнять преобразование данных и отчеты об ошибках, которые будут иметь смысл для обеих сторон (ваше приложение NET и COM DLL).

Я думаю, что это должно решить вашу проблему.

EDIT

На самом деле я думал, что дальше это и вышеописанный процесс не будет работать. Это связано с тем, что целевые процессоры X86, x64 и Itanium настолько принципиально отличаются друг от друга.

отредактирован x64 может работать x86 целенаправленные код и так может Itanium (который использовал эмулятор и теперь удлинительный EM64T)

Там больше информации here

То, что вы можете быть в состоянии сделать, хотя запускает вашу x86-dll в рамках отдельного процесса и реализует некоторую форму связи между ними. Думаю, именно поэтому вы упомянули WCF. Я говорю это, потому что программное обеспечение x86 должно работать в системе x64.

Это будет означать, что ваше решение будет иметь два исполняемых файла один x86 и один AnyCPU, поскольку сборку можно настроить только на один тип ЦП.

+0

Но чем моя обертка должна быть скомпилирована с x86 и моей основной программой с помощью «anycpu». Если теперь моя программа использует класс, например. «MyWrapper» (x86) и этот класс используют 32-битную COM-DLL. Это не работает. Я стал исключением, потому что mit «AnyCPU» -Программа не может использовать сборку из WrapperProject. – sTaX

+0

На самом деле я ушел и подумал об этом больше. См. Мой ответ. – ChrisBD

+1

Просто для nit-pick, IA64 включает декодер, который «эмулирует» инструкции x86, однако ** x64 является надлежащим расширением x86, которое все еще способно запускать код x86 ** (хотя и не в том же процессе, что и x64-код под Windows) – Justin

1

Если вы не хотите менять свою сборку на «x86», вам нужно использовать некоторую форму IPC, из которой WCF является только одной. Другой вариант - использовать Named Pipes для связи между двумя процессами.

+0

Нет, я не могу перейти на x86 (основная программа). У вас есть хороший пример для .Net -> 2.0 <-? WCF работает только с .net 3.5 или выше? – sTaX

+0

Именованные каналы также недоступны в .NET 2.0. –