2017-02-14 17 views
8

Próbuję użyć kodu this w projekcie Unity, ale wygląda na to, że implementacje COM Interop w Mono/.NET są różne, co powoduje awarię lub awarię kodu. Uruchomienie kodu w .NET działa dobrze, ale uruchomienie go z Mono 2.0 (poza Unity) kończy się niepowodzeniem w taki sam sposób, jak w Unity, co sugeruje, że jest to problem z Mono w ogóle, a nie z Unity.COM Interop w Mono 2.0

Jeśli skompiluję i uruchomimy kod w niezmienionej postaci, nie powiedzie się, ponieważ type cast z MMDeviceEnumerator na IIMMDeviceEnumerator nie powiedzie się. Podczas dekorowania wszystkich interfejsów za pomocą [ComInterop], rzutowanie się powiedzie, ale wywołanie GetDefaultAudioEndpoint powoduje awarię Unity/Mono z naruszeniem dostępu.

Trudno jest znaleźć dobrą dokumentację COM Interop na temat Mono w ogóle - w szczególności w odniesieniu do tak starej wersji. Czy to w ogóle możliwe, żeby to działało?

Odpowiedz

1

Zawiń funkcje COM w funkcjach C i wywołaj funkcje C za pomocą P/Invoke. Można to zrobić w dwóch etapach:

  1. Utwórz projekt VC++, który otoczy funkcje potrzebne w wasapi. Ujawnij je za pomocą module define file lub __declspec(dllexport). Zbuduj kod do biblioteki dll, która eksponuje potrzebne funkcje.
  2. W projekcie Unity3D, uzyskaj do nich dostęp za pomocą P/Invoke.

Oto example. W twoim przypadku wystarczy użyć kodu COM w części C/C++, aby zrobić to, co chcesz.

+0

To było dokładnie to, co skończyłem robiąc – Johan

-2

Mono 1.0 and Mono 1.1.xx do not have support for COM.

Przestań próbować z Mono, Mono służy do niezależności od platformy i COM Interop to tylko Microsoft. Użyj SDKów Open Source do odtwarzania wideo lub lepiej wywołaj aplikacje z linii poleceń, takie jak vlc, aby grać, kodować itp.