2017-02-14 3 views
8

J'essaie d'utiliser le code this dans un projet Unity, mais il semble que les implémentations de COM Interop dans Mono/.NET diffèrent, ce qui provoque l'échec du code ou son blocage. L'exécution du code dans .NET fonctionne bien, mais l'exécuter avec Mono 2.0 (en dehors de Unity) échoue de la même manière que dans Unity, ce qui suggère que c'est un problème avec Mono en général et non avec Unity.COM Interop dans Mono 2.0

Si je compile et exécute le code tel quel, il échoue car le type cast de MMDeviceEnumerator à IIMMDeviceEnumerator échoue. Lorsque vous décorez toutes les interfaces avec [ComInterop], la distribution réussit, mais l'appel à GetDefaultAudioEndpoint bloque Unity/Mono avec une violation d'accès.

Il est difficile de trouver une bonne documentation de COM Interop sur Mono en général - et particulièrement en ce qui concerne une telle ancienne version. Est-il possible de faire fonctionner ça?

Répondre

1

Envelopper les fonctions COM dans les fonctions et appeler les fonctions C via P/Invoke à la place. Cela peut se faire en deux étapes:

  1. Créer un projet VC++ qui enveloppe les fonctions dont vous aviez besoin dans WASAPI. Exposez-les via un module define file ou __declspec(dllexport). Construisez le code dans une DLL qui expose les fonctions dont vous avez besoin.
  2. Dans votre projet Unity3D, accédez-y via P/Invoke.

Voici un example. Dans votre cas, utilisez simplement le code COM dans la partie C/C++ pour faire ce que vous voulez.

+0

C'était exactement ce que j'ai fini par faire – Johan

-2

Mono 1.0 and Mono 1.1.xx do not have support for COM. Arrêter d'essayer avec Mono, Mono est pour l'indépendance de la plate-forme et COM Interop est Microsoft uniquement. Utilisez des SDK open source pour jouer à la vidéo ou mieux invoquer des applications à partir de la ligne de commande comme vlc pour jouer, encoder, etc.