Mono 2.0 中的 COM 互操作

COM Interop in Mono 2.0

我正在尝试在 Unity 项目中使用 this 代码,但似乎 Mono/.NET 中 COM Interop 的实现不同,这导致代码失败或崩溃。 运行 .NET 中的代码工作正常,但是 运行 使用 Mono 2.0(在 Unity 之外)将其与在 Unity 中一样失败,表明这是 Mono 的问题,而不是 Unity .

如果我按原样编译并 运行 代码,它会失败,因为从 MMDeviceEnumerator 到 IIMMDeviceEnumerator 的 type cast 失败。使用 [ComInterop] 修饰所有接口时,转换成功,但对 GetDefaultAudioEndpoint 的调用因访问冲突而崩溃 Unity/Mono。

一般来说,很难找到有关 Mono 上 COM Interop 的良好文档 - 尤其是对于这样一个旧版本。有没有可能得到这个 运行ning?

将 COM 函数包装在 C 函数中,然后通过 P/Invoke 调用 C 函数。这可以分两步完成:

  1. 创建一个 VC++ 项目,将您需要的函数包装在 wasapi 中。通过 module define file or __declspec(dllexport) 公开它们。将代码构建到公开您需要的功能的 dll 中。
  2. 在您的 Unity3D 项目中,通过 P/Invoke 访问它们。

这是一个。在您的情况下,只需使用 C/C++ 部分中的 COM 代码即可执行您想要的操作。

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

停止尝试使用 Mono,Mono 是为了平台独立性,COM Interop 仅适用于 Microsoft。使用开源 SDK 进行视频播放或更好地从命令行调用应用程序,例如 vlc 来播放、编码等