Используйте 32-битную DLL в 64-битном приложении с .Net 2.0 - PullRequest
2 голосов
/ 15 февраля 2012

Мне нужно использовать COM-DLL от сторонней компании (поэтому у меня нет исходного кода), которая работает только с опцией компиляции CPU-Target x86.

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

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

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

См. Межпроцессное взаимодействие для Windows в C # (.NET 2.0)

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

1 голос
/ 15 февраля 2012

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

0 голосов
/ 15 февраля 2012

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

Оболочка может обрабатывать все вызовы взаимодействия с dll.

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

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

РЕДАКТИРОВАТЬ

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

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

Здесь больше информации здесь

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

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

...