C# Marshal.GetFunctionPointerForDelegate在.NET内核中工作,但在.NET Framework中不工作
我正在测试一个用C#编写的SDK,它附带了一个用.NETCore2.0编写的演示控制台应用程序。我试图在WPF中复制该应用程序,并尽可能保持代码不变。我在对SDK API的方法调用中得到了这个异常,该方法添加了某些回调:无法封送“参数#3”:无法封送泛型类型。这是通过在方法内部调用Marshal.GetFunctionPointerForDelegate实现的。我没有更改任何代码,它在他们的演示应用程序中工作,并在我的应用程序中引发异常。下面是方法调用:C# Marshal.GetFunctionPointerForDelegate在.NET内核中工作,但在.NET Framework中不工作,c#,.net,.net-core,C#,.net,.net Core,我正在测试一个用C#编写的SDK,它附带了一个用.NETCore2.0编写的演示控制台应用程序。我试图在WPF中复制该应用程序,并尽可能保持代码不变。我在对SDK API的方法调用中得到了这个异常,该方法添加了某些回调:无法封送“参数#3”:无法封送泛型类型。这是通过在方法内部调用Marshal.GetFunctionPointerForDelegate实现的。我没有更改任何代码,它在他们的演示应用程序中工作,并在我的应用程序中引发异常。下面是方法调用: _tracking_callback_i
_tracking_callback_id =
video_worker.addTrackingCallback(
TrackingCallback,
this);
下面是API中定义的回调本身:
public delegate void TrackingCallback(int stream_id, int frame_id, List<RawSample> samples, List<bool> samples_weak, List<float> samples_quality, object userdata);
public delegate void TrackingCallback(int stream\u id,int frame\u id,List samples\u弱,List samples\u质量,object userdata);
当我为他们的演示制作.NET Framework控制台应用程序副本时,也会发生这种情况,这表明它与.NET Core有关,但我不确定是什么。将代理的副本放在静态变量(或与
视频工作者
寿命相同的变量)中,否则GC将释放委托。从非托管数据创建列表
,这让我非常困惑。这不是问题所在,但它究竟是从哪里获得集合大小的?CoreCLR有自己的功能,可能与WinRT类型的投影有关。但在桌面CLR版本中,这显然是不可能的。你所能做的就是联系SDK提供商,告诉他们“嘿,这在WPF中不起作用”。也要问一下集合的大小,它太臭了。@HansPassant我向SDK提供商报告了这个问题,他们承认这是他们代码中的一个bug,他们会在下一个SDK版本中修复它。