У меня есть сторонний компонент, скажем, FIPreviewHandler для обработки предварительного просмотра, который реализует IPreviewHandler.FIPreviewHandler реализован как управляемый компонент и использует интерфейс IPreviewHandler и связанные интерфейсы посредством взаимодействия.FIPreviewHandler зарегистрирован с помощью regasm.exe как COM.
У меня есть клиентское приложение, которое также управляется.Я хочу создать экземпляр FIPreviewHandler в качестве COM-компонента в моем приложении.
У меня есть сборка взаимодействия, которая определяет IPreviewHandler и связанные интерфейсы.
Когда я создаю экземпляр FIPreviewHandler, используя Activator.CreateInstance (), для типа, возвращаемого GetTypeByCLSID (), который использует правильный CLSID для FIPreviewHandler, он возвращает мне управляемый экземпляр, поскольку он имеет фактическийсборка доступна, и пропускает COM.Когда я пытаюсь выполнить QI / приведение этого экземпляра в качестве любого из интерфейсов, например, IPreviewHandler, он возвращает значение null, поскольку он загружается как управляемый объект, и хотя интерфейс IPreviewHandler, реализованный FIPreviewHandler, является тем же интерфейсом, что и я в моем взаимодействии, но его в пространстве имен разницы / сборке, следовательно, ноль.Если бы он возвратил мне экземпляр COM / RCW (System .__ ComObject), он не принял бы во внимание пространство имен, произвел бы корректный сброс и вернул бы действительный экземпляр.
FIPreviewHandler - 32-разрядный компонент, ина 64-битной машине Win7, если я компилирую свое клиентское приложение как «Любой ЦП», Activator.CreateInstance () возвращает экземпляр COM / RCW (System .__ ComObject), поскольку он не может найти 64-битную реализацию FIPreviewHandler, следовательно, возвращает прокси.В этом случае мое приложение работает нормально.Но когда я компилирую его для x86, он получает 32-битную реализацию и возвращает управляемый экземпляр фактического управляемого класса, а не экземпляр COM, следовательно, происходит сбой.
Я не могу использовать интерфейсы, определенные в сборке FIPreviewHandler,так как мне нужно написать универсальный клиент для IPreviewHandler, и мое приложение будет работать с любым компонентом, реализующим IPreviewHandler, который отлично работает для клиентов на C ++, получающих доступ к FIPreviewHandler как объект COM, но не работает для управляемых клиентов.
Я надеюсь, что в этом есть смысл, и я был бы очень благодарен за любую помощь.