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