我有一个c ++函数要导出为.dll使用:
static __declspec(dllexport) void DiagEncrypt(
UCHAR * ptrDataByte,
size_t numBytes,
ACCESS_LEVEL accLevel);
void DiagnosticCrypto::DiagEncrypt(UCHAR * ptrDataByte, size_t numBytes, ACCESS_LEVEL accLevel)
我在C#程序中导入它:
[DllImport("DiagnosticCryptoDll.dll", EntryPoint = "?DiagEncrypt@DiagnosticCrypto@DiagnosticCryptoDll@@SAXPAEIW4ACCESS_LEVEL@12@@Z", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern void DiagEncrypt(
//[MarshalAs(UnmanagedType.LPArray)] byte[] data,
IntPtr data,
uint numBytes, //UintPtr numBytes,
ACCESS_LEVEL accLevel);
当我执行它时,存在堆栈不平衡的错误。
有人可以帮我找出错误的位置吗?
标记的部分是我尝试但失败了。
答案 0 :(得分:0)
您的C ++代码使用cdecl
调用约定,但您的p / invoke使用stdcall
。改变或匹配其他。
例如,您可以更改p / invoke以使用CallingConvention.Cdecl
。
我要做的其他评论是:
extern "C"
来抑制C ++名称修改。虽然在评论中,汉斯争辩说要破坏。size_t
映射到uint
。这将在32位上正常工作,但在64位上不起作用,其中size_t
为64位宽。我建议你在这里使用UIntPtr
。