在托管代码和本机DLL之间编组字符串

时间:2017-03-16 10:01:50

标签: c# c dll marshalling unmarshalling

我正在尝试实施License Manager模块。 我已经在C中编写了核心代码,并希望在C#中编写包装器来实现它。 native dll具有以下形式的导出:

typedef void (__stdcall *DMTypedef)(const char * const iMsg);
typedef int (__stdcall *RKTypedef)(
    const int (__stdcall *validator)
        (const char * const iKey, const char * const iAppID));

__declspec(dllexport) const void __stdcall initWindowManager(DMTypedef iDisplayMsg, RKTypedef iReadKey);

基本上,我想将IO实施与许可模块分开。 因此,在继续使用其他代码之前,调用者需要调用initWindowManager()

到目前为止,我已经成功编写了编组代码,但其中一部分似乎并没有像我预期的那样工作。这是代码:

using System;
using System.Runtime.InteropServices;

namespace LicenseManagerWrapper
{
    unsafe public static class Plugin_License
    {
        internal const string NativeDLLPath = @".\LicenseManagerNative.dll";

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void DMDelegate(
            [MarshalAs(UnmanagedType.LPStr)]
            string iMsg
            );

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int ValDelegate(
            [MarshalAs(UnmanagedType.LPStr)]
            string key,
            [MarshalAs(UnmanagedType.LPStr)]
            string appID
            );

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int RKDelegate(ValDelegate validator);

        [DllImport(NativeDLLPath,
            CallingConvention = CallingConvention.StdCall)]
        private static extern void initWindowManager(
            [MarshalAs(UnmanagedType.FunctionPtr)]
            DMDelegate displayMessage,

            [MarshalAs(UnmanagedType.FunctionPtr)]
            RKDelegate readKey
            );

        public static void initWM(DMDelegate iDisplayMessage, RKDelegate iReadKey)
        {
            initWindowManager(iDisplayMessage, iReadKey);
        }
    }
}

我正在Visual Studio 1264-bit.NET 4.0工作。 调试器显示正确的函数调用序列,但是当我在readkey()的{​​{1}}中,RKDelegate中的实现代码时,C#的控件达到validate()ValDelegate在本机代码中,char *指针不正确,调试器显示bad-pointer。有人能说出我做错了吗? 我跟着this帖子,但仍然无法解决这里的问题。有人能告诉我,我做错了什么? 为冗长的帖子道歉。这是一个图形表示的尝试:

+------------------------------+                            +------------------------------+
|          Native DLL          |                            |         Managed Code         |
+------------------------------+                            +------------------------------+
|      initWindowManager()<----|----------------------------|-------- displayMessage()     |
|          validate()----------|----------------------------|-------> readKey()            |
|                              |                            |                              |
|                              |                            |                              |
|                              |                            |                              |
+------------------------------+                            +------------------------------+

0 个答案:

没有答案