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
方法
- 有没有办法告诉自定义封送拆收器向我提供 0 IntPtr 值?
- 是否有解决此问题的技巧?
- 有没有更好的工作方式?
根据 Hans 的评论,这是不可能的。
为了实现类似的功能,我创建了 public/private 影子函数,return 我的包装器 class。
implicit operator
函数接收为 0 或其他值的 IntPtr,并调用我的包装器 class 的构造函数,然后我在其中添加代码来处理调用 'GetLastError' 如果IntPtr 为 0.
我已经为 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
方法
- 有没有办法告诉自定义封送拆收器向我提供 0 IntPtr 值?
- 是否有解决此问题的技巧?
- 有没有更好的工作方式?
根据 Hans 的评论,这是不可能的。
为了实现类似的功能,我创建了 public/private 影子函数,return 我的包装器 class。
implicit operator
函数接收为 0 或其他值的 IntPtr,并调用我的包装器 class 的构造函数,然后我在其中添加代码来处理调用 'GetLastError' 如果IntPtr 为 0.