У меня есть неуправляемые классы C ++, которые правильно реализуют IUnknown. Я компилирую код в общую библиотеку и развертываю библиотеку для использования на телефоне Android. Я реализовал простое приложение Xamarin.Forms (C#), которое использует эту библиотеку через стандартный P / Invoke. Используя фабричный метод, я создаю набор этих классов, каждый из которых имеет свой собственный тип c (и также реализует свой собственный интерфейс, таким образом возвращая вызов S_OK
в QueryInterface
с поддерживаемым iid
).
Объект создается с использованием собственного фабричного метода P / Invoked, поэтому я получаю действительный указатель типа IntPtr
.
Однако, когда я пытаюсь позвонить
IntPtr myObj = NativeBridge.CreateMyObject();
var obj = Marshal.GetObjectForIUnknown(myObj);
, код выдает PlatformNotSupportedException
.
На сайте https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getobjectforiunknown?view=netstandard-2.0 указано, что это поддерживается в. NET Standard 2.0, который я использую.
Мой проект Xamarin.Forms скомпилирован как Xamarin. Android + Shared. NET Библиотека Standard 2.0 в MS Visual Studio 2017.
Есть ли какие-то последствия, которые я упустил? Действительно ли GetObjectForIUnknown не поддерживается в Xamarin в этой конфигурации? Есть ли альтернативы достижению sh таких же / похожих результатов? Или я делаю что-то совершенно не так на стороне C#?
EDIT1: вызов Marshal.QueryInterface
на том же IntPtr
выдает NotImplementedException
EDIT2: кажется, не поддерживается в Mono в master: https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs - реализации методов QueryInterface
и GetObjectForIUnknown
обернуты в условные выражения для MOBILE
.
Итак, мой вопрос: могу ли я как-нибудь использовать Модель COM на Mono / Android в Xamarin.Forms, без развертывания моей собственной собственной библиотеки, которая связывает реализации?