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

C# Custom Marshaling - ICustomMarshaler implementation not supplied with zero IntPtr values

我已经为 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 方法 return 是一个非零的 IntPtr 时,这很好用。我可以将它转换为我的 return 对象 JuliaWrapper,一切都很好。


当我使用无效参数执行 jl_eval_string 并且它 return 是一个零 IntPtr 时,问题就来了。

我想在我的 JuliaWrapper 对象中处理它并自动调用 'get last error'。但是我没有机会,因为当 jl_eval_string 方法 returns 0x0000 时永远不会调用 ICustomMarshaler.MarshalNativeToManaged 方法

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

为了实现类似的功能,我创建了 public/private 影子函数,return 我的包装器 class。

implicit operator 函数接收为 0 或其他值的 IntPtr,并调用我的包装器 class 的构造函数,然后我在其中添加代码来处理调用 'GetLastError' 如果IntPtr 为 0.