Мне нужно использовать 32-разрядный неуправляемый COM-сервер в 64-разрядном приложении .NET.
Я провел небольшое исследование, и мне показалось, что я нашел подходящее решение: размещение COM-сервера в COM + * 1003.* серверное приложение .Таким образом, компонент активируется в выделенном (32-битном) процессе и связывается с 64-битным процессом через RPC.( ссылка )
Чтобы проверить вышесказанное, я создал образец COM-сервера и зарегистрировал его в приложении COM +.Его интерфейс выглядит следующим образом:
interface ITestComObj: IUnknown
{
HRESULT _stdcall Ping( void );
HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output );
};
Затем я создал простое консольное приложение .NET, которое вызывает эти методы через COM-взаимодействие.
Сначала я протестировал его на 32-битном WinXP, и он работалхорошо.
Затем я перешел на 64-битную Win7.Первый вызов (к методу Ping () без параметров) был успешным, но второй вызов вызвал исключение (после некоторого ожидания): удаленный вызов процедуры не удался.(Исключение из HRESULT: 0x800706BE).
Я провел дальнейшие исследования.Я заставил клиента в 32-битный процесс (встроенный в целевую платформу x86), чтобы увидеть, если что-то меняется, но результат был тот же.Однако, если я переключился на внутрипроцессную активацию (изменил тип приложения COM + на библиотечное приложение), клиент работал.
Очевидно, что-то с межпроцессной передачей параметров происходит неправильно в Win7, но я не могне найдете ответа даже после поисков в течение нескольких часов.
Есть идеи?