Код ниже выполняется без проблем в 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-битной
- Dueне является runnin g, а первая строка кода с
HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)
. Это прекрасно и происходит также в 32-битной версии. - 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
на новую созданную платформу-агностик, мое решение не удалось скомпилировать (отсутствующие ссылки).
Хмм, 0x80040154 довольно странно. Но, конечно, проблема в том, что у вас нет 64-разрядной версии прокси. Используйте монитор процессов SysInternals, чтобы получить представление. –
Если вы проголосуете, пожалуйста, оставьте комментарий почему. – participant
@HansPassant Я попробовал ProcessMonitor, пожалуйста, посмотрите мои изменения для результатов. – participant