COM-взаимодействие в Mono 2.0

Я пытаюсь использовать этот код в проекте Unity, но кажется, что реализации COM Interop в Mono/.NET отличается, что приводит к сбою или сбою кода. Запуск кода в .NET работает нормально, но запуск его с Mono 2.0 (вне Unity) завершается с ошибкой так же, как и в Unity, что позволяет предположить, что это проблема с Mono в целом, а не с Unity.

Если я скомпилирую и запущу код как есть, произойдет сбой, потому что приведение типов с MMDeviceEnumerator на IIMMDeviceEnumerator завершается ошибкой. При оформлении всех интерфейсов с помощью [ComInterop] приведение выполняется успешно, но вызов GetDefaultAudioEndpoint приводит к сбою Unity/Mono с нарушением прав доступа.

Трудно найти хорошую документацию по COM-взаимодействию на Mono в целом, особенно в отношении такой старой версии. Это вообще возможно запустить?


person Johan    schedule 14.02.2017    source источник


Ответы (2)


Оберните функции COM в функции C и вместо этого вызовите функции C через P/Invoke. Это можно сделать в два этапа:

  1. Создайте проект VC++, который включает в себя необходимые вам функции в wasapi. Предоставьте их через файл определения модуля или __declspec(dllexport). Встройте код в dll, который предоставляет нужные вам функции.
  2. В вашем проекте Unity3D получите к ним доступ через P/Invoke.

Вот пример. В вашем случае просто используйте код COM в части C/C++, чтобы делать то, что вы хотите.

person zwcloud    schedule 21.02.2017
comment
Это было именно то, что я в итоге сделал - person Johan; 24.02.2017

Mono 1.0 и Mono 1.1.xx не поддерживают COM .

Не пытайтесь использовать Mono, Mono предназначен для независимости от платформы, а COM Interop — только для Microsoft. Используйте SDK с открытым исходным кодом для воспроизведения видео или лучше запускайте приложения из командной строки, такие как vlc, для воспроизведения, кодирования и т. д.

person SACn    schedule 24.02.2017