C#自定义封送处理-ICustomMarshaler实现未提供零IntPtr值

时间:2019-05-30 16:55:50

标签: c# julia marshalling dllimport

我为API实现了一个非常简单的自定义封送拆封器:

自定义封送拆集器:

  private sealed class JuliaWrapperMarshaller : ICustomMarshaler
  {
      object ICustomMarshaler.MarshalNativeToManaged(IntPtr pNativeData) => (JuliaWrapper)pNativeData;

     [other methods removed]  
  }

API:

    [DllImport(@"libjulia.dll", CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(JuliaWrapperMarshaller))]
    public static extern JuliaWrapper jl_eval_string(string str);

并且当jl_eval_string方法返回非零的IntPtr时,此方法工作正常。我可以将其转换为返回对象JuliaWrapper,一切都很好。


当我使用无效参数执行jl_eval_string并且返回零IntPtr时,就会出现问题。

我想在我的JuliaWrapper对象中处理此问题,并自动调用“获取上一个错误”。但是,我没有机会,因为当ICustomMarshaler.MarshalNativeToManaged方法返回jl_eval_string

时,永远不会调用0x0000方法
  • 是否可以告诉自定义封送拆收器向我提供0个IntPtr值?
  • 是否有解决方法?
  • 是否有更好的工作方式?

1 个答案:

答案 0 :(得分:1)

根据汉斯的评论,这是不可能的。

为了实现类似的功能,我创建了公共/私有影子函数,这些函数返回包装器类。

enter image description here

implicit operator函数收到的IntPtr为0或其他值,并调用包装类的构造函数,然后,如果IntPtr为0,我将在其中包含处理调用“ GetLastError”的代码。

enter image description here