Я пытаюсь использовать библиотеку NAudio в проекте Unity3D.При вызове MMDeviceEnumerator.EnumerateAudioEndPoints генерируется исключение NullReferenceException.Это не происходит в проекте Visual Studio, ориентированном на .NET 2.0.Сам перечислитель не равен нулю.Этот метод оборачивает вызов IMMDeviceEnumerator.EnumAudioEndpoints, который непосредственно вызывает это исключение (я переместил кучу кода из NAudio в мой проект Unity3D).
Единственное реальное отличие состоит в том, что он работает внутри Unity3Dигра, а не стандартное приложение Visual Studio.Что может быть причиной этого?Пожалуйста, помогите.
Обновление:
Мой код, который выбрасывает (вторая строка):
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.All);
NA Аудио код, который выдает (вторая строка метода):
public MMDeviceCollection EnumerateAudioEndPoints(DataFlow dataFlow, DeviceState dwStateMask)
{
IMMDeviceCollection result;
Marshal.ThrowExceptionForHR(_realEnumerator.EnumAudioEndpoints(dataFlow, dwStateMask, out result));
return new MMDeviceCollection(result);
}
Обновление x2:
В конструкторе для MMDeviceEnumerator в NAudio:
_realEnumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
Новый объект com не равен NULL, но при касте становится нулевым.Опять же, это работает в проекте Visual Studio, но не в Unity3D.Вот определения каждого (из источника NAudio):
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
class MMDeviceEnumeratorComObject
{
}
и
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator
{
int EnumAudioEndpoints(DataFlow dataFlow, DeviceState stateMask,
out IMMDeviceCollection devices);
int GetDefaultAudioEndpoint(DataFlow dataFlow, Role role, out IMMDevice endpoint);
int GetDevice(string id, out IMMDevice deviceName);
int RegisterEndpointNotificationCallback(IMMNotificationClient client);
int UnregisterEndpointNotificationCallback(IMMNotificationClient client);
}
Я могу разместить другие объекты там, если это необходимо.Чего мне не хватает, так это того, что ядро «почему» может измениться между Unity3D (также ориентированным на .NET 2.0) и Visual Studio.