2015-06-02 3 views
-1

Код ниже выполняется без проблем в 32-битном C# -приложении.Использование 32-битного COM-объекта в 64-битной среде

object obj = system.Runtime.InteropServices.Marshal.GetActiveObject("Due.Application"); 

var due = (Due.IDueApplication2)obj; 

Теперь я пытаюсь получить тот же код работает в 64-битной C# -Применение и поэтому я следовал инструкциям на

http://www.gfi.com/blog/32bit-object-64bit-environment/ или http://www.codeproject.com/Tips/267554/Using-bit-COM-Object-from-bit-Application

два случая при запуске приложения 64-битной

  1. Dueне является runnin g, а первая строка кода с HRESULT: 0x800401E3 (MK_E_UNAVAILABLE). Это прекрасно и происходит также в 32-битной версии.
  2. Dueis running and in the first code-line obj получает COM-объект. Но тогда вторая строка кода выдает InvalidCastException, потому что QueryInterface не работает с HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG). (Очевидно, что это работает в 32-битной версии.)

Q Что я должен сделать, чтобы сделать бросок во 2-й код строки, чтобы добиться успеха?

Редактировать Как предложил @HansPassant, я включил ProcessMonitor и отслеживал как 32-битное, так и 64-битное приложение. Я заметил, что 64-битное приложение при выполнении GetActiveObject (1-я строка кода) пропустило доступ к соответствующей DLL-объекту COM-объекта (CreateFile, QueryBasicInformationFile, QueryNameInformationFile, ...), что в отличие от 32-битного приложения, хотя я добавил соответствующий записи реестра заблаговременно, т.е. AppID, DllSurrogate.

Редактировать 1 Я удалил все записи реестра, которые я добавил, и дважды проверил результаты, включая файлы журнала ProcessMonitor. Я не заметил никакой разницы - те же симптомы, что и раньше.

Update В каталоге программного обеспечения 3-й партии я нашел Due.tlb и я пытался создать во время выполнения вызываемого-обертки, как намекнул в 64 to 32 bit Interop - how?.

Я создал Interop.due.dll с tlbimp.exe Due.tlb /out:Interop.due.dll. К сожалению, когда я заменил исходный 32-разрядный Interop.deu.dll на новую созданную платформу-агностик, мое решение не удалось скомпилировать (отсутствующие ссылки).

+1

Хмм, 0x80040154 довольно странно. Но, конечно, проблема в том, что у вас нет 64-разрядной версии прокси. Используйте монитор процессов SysInternals, чтобы получить представление. –

+0

Если вы проголосуете, пожалуйста, оставьте комментарий почему. – participant

+0

@HansPassant Я попробовал ProcessMonitor, пожалуйста, посмотрите мои изменения для результатов. – participant

ответ

0

Единственное, что сработало, было решением, не относящимся к процессу. Я реализовал 32-bit WCF-service, который обеспечивает доступ к COM-объектам для 64-битного процесса. (Таким образом, я реализовал Прокси-сервер сам.)

объявление Обновление

хорошие новости

Используя информацию в этом post я был в состоянии регенерировать платформы агностик версию Interop.due.dll.Несмотря на то, что TlbImp.exe предупредил меня с Предупреждение TI3002: Импорт библиотеки типов в агностическую сборку платформы. Это может привести к ошибкам, если библиотека типов не является агностикой платформы.

плохие новости

Обещанная клей код не был предоставлен, и, следовательно, шунтирующий из 64-битных и 32-битных не получилось. (32-разрядная версия работала, как и раньше.)