Я реализовал очень простой пользовательский маршалер для 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
объекте и автоматически вызвать 'get last error'. Однако у меня нет возможности , потому что метод ICustomMarshaler.MarshalNativeToManaged
никогда не вызывается, когда метод jl_eval_string
возвращает 0x0000
- Есть ли способ сообщить пользовательскому маршалеру предоставить мне 0 значений IntPtr?
- Есть ли какие-нибудь хаки, чтобы обойти это?
- Есть ли лучший способ работы?