Marshal va_list in C# delegate

后端 未结 4 553
孤城傲影
孤城傲影 2021-01-13 08:04

I\'m trying to make this work from c#:

C header:

typedef void (LogFunc) (const char *format, va_list args);
         


        
4条回答
  •  北海茫月
    2021-01-13 08:45

    Another approach is to pass the va_list back to native code, something like calling vprintf in .net. I had the same issue, and I wanted it cross platform. So I wrote a sample project to demonstrate how it could work on several platforms.

    See https://github.com/jeremyVignelles/va-list-interop-demo

    The basic idea is :

    You declare your callback delegate:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    internal delegate void LogFunc(string format, IntPtr args);
    

    You pass your callback as you did:

    NativeMethods.Init(5, LogMessage);
    

    In the callback, you handle the specific cases of the different platforms. You need to understand how it works on each platform. From my testing and understanding, you can pass the IntPtr as-is to the vprintf* family of functions on Windows (x86,x64) and Linux x86, but on Linux x64, you will need to copy a structure for that to work.

    See my demo for more explanations.

    EDIT : We posted an issue on .net runtime's repository a while back, you can see it here https://github.com/dotnet/runtime/issues/9316 . Unfortunately, it didn't went far because we lacked a formal proposal.

提交回复
热议问题