如何从 C# 互操作代码创建一个苹果块?

问题描述

Apple 最近弃用了 MIDIDestinationCreate 方法并将其替换为 MidiDestinationCreateWithProtocol (MIDIDestinationCreate)

旧方法需要传递一个简单的回调方法“MIDIReadProc”,它来自 C# 可以通过创建以下委托签名来完成,然后创建一个委托并分配一个方法作为回调。我们声明委托签名:

internal delegate void MIDIReadProc(MIDIPacketListPtr pktlist,IntPtr readProcRefCon,IntPtr srcConnRefCon);

创建一个委托以将我们的回调方法分配给:

private CoreMidiInterop.NativeMethods.MIDIReadProc m_readProcDelegate; 

为我们创建的委托分配一个方法:

m_readProcDelegate = CallMessageReceived;

创建一个回调方法,它应该从 macOS Core MIDI 接收 MIDI 消息:

private void CallMessageReceived(MIDIPacketListPtr pktlist,IntPtr srcConnRefCon)
{
   ...
}

最终将此委托传递给苹果核心 MIDI 方法:

CoreMidiInterop.NativeMethods
                .MIDIDestinationCreate(m_clientRef,CoreFoundationUtils.ToCFStringRef(name),m_readProcDelegate,CFStringRef.Zero,out MIDIEndpointRef destinationRef);

这一切都按预期工作。

现在已弃用,不再适用于 macOS Big Sur。新方法“MidiDestinationCreateWithProtocol”需要一个苹果块作为回调参数(称为MIDIReceiveBlock readBlock):

OSStatus MIDIDestinationCreateWithProtocol(MIDIClientRef client,CFStringRef name,MIDIProtocolID protocol,MIDIEndpointRef *outDest,MIDIReceiveBlock readBlock);

此处的文档:MIDIReceiveBlock

如何用 C# 代码创建一个苹果块?我一直在寻找示例,但找不到任何示例。我确实在这里开始研究苹果块的底层实现:

Block Implementation Specification

这不是一件简单的事情,因此任何有关如何在 C# 中执行此操作的帮助/示例都会非常有帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)