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