求教一个C#引用C++DIl 做接口的问题,高手请进
先来短代码
WORD __stdcall LMMTP_WrapMessageProperty(DWORD SerialID, WORD UserID, PLMMTP_MESSAGE_PROPERTY_DATA pMsgProperty,
BYTE ValidTimeCount,PLMMTP_VALIDTIME_DATA pValidTimes,
BYTE RegionCount, PLMMTP_REGION_DATA pRegions, BYTE *pDest);
这是C++中的函数定义
其中几个常字符串类型的变量都是结构类型,例如PLMMTP_MESSAGE_PROPERTY_DATA,那么我在C#中该如何声明该接口呢。
我是这样写的
//WORD __stdcall LMMTP_WrapMessageProperty(DWORD SerialID, WORD UserID, PLMMTP_MESSAGE_PROPERTY_DATA pMsgProperty,BYTE ValidTimeCount,PLMMTP_VALIDTIME_DATA pValidTimes, BYTE RegionCount, PLMMTP_REGION_DATA pRegions, BYTE *pDest);
[DllImport("LMMTPLib.DLL", EntryPoint = "LMMTP_WrapMessageProperty")]
public static extern ushort LMMTP_WrapMessageProperty(uint SerialID, ushort UserID, PLMMTP_MESSAGE_PROPERTY_DATA pMsgProperty, byte ValidTimeCount, PLMMTP_VALIDTIME_DATA pValidTimes, byte RegionCount, PLMMTP_REGION_DATA pRegions, byte[] pDest);
/// <summary>
///
/// </summary>
/// <param name="SerialID"></param>
/// <param name="UserID"></param>
/// <param name="pMsgProperty"></param>
/// <param name="ValidTimeCount"></param>
/// <param name="pValidTimes"></param>
/// <param name="RegionCount"></param>
/// <param name="pRegions"></param>
/// <param name="pDest"></param>
/// <returns></returns>
public static int WrapMessageProperty(uint SerialID, ushort UserID, PLMMTP_MESSAGE_PROPERTY_DATA pMsgProperty, byte ValidTimeCount, PLMMTP_VALIDTIME_DATA pValidTimes, byte RegionCount, PLMMTP_REGION_DATA pRegions,ref byte[] pDest)
{
return LMMTP_WrapMessageProperty(SerialID, UserID, pMsgProperty, ValidTimeCount, pValidTimes, RegionCount, pRegions,pDest);
}
但程序执行时,报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”异常,是不是我的数据类型定义错了,这种异常在什么情况下会被抛出,高手帮忙,谢谢 C# C++ 内存 类
[解决办法]
结构体你得跟着在C#里定义一个Struct
[解决办法]
PLMMTP_VALIDTIME_DATA
PLMMTP_REGION_DATA
把这两个结构体的c++原型一起发出来
ps:如果你有c++的h头文件,可以直接用swig转换,如果没有头文件,只有片段签名代码声明,可以用PInvoke Signature Toolkit转换,当然工具转换不能保证100%正确,不过在转换后的代码上稍微调整一下基本可用
[解决办法]
出现这种问题,基本上就是类型转换的错误,还有结构体定义是的类型错误,就是说他按照原来的读写方式读写,但是你内存申请的大小不一样,所以导致了错误,好好比对一下类型,不行就sizeof一下,看看实际的大小。
[解决办法]
结构指针应该对应c# ref 结构:
ref PLMMTP_MESSAGE_PROPERTY_DATA pMsgProperty,
ref PLMMTP_VALIDTIME_DATA pValidTimes
pDest要根据用法转成不同的类型,比如:
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 100)] byte[] pDest
[解决办法]
C#中要使用指针一类的要将该代码段声明为unsafe的(即可能发生内存泄漏或是不安全的代码需要声明)
[解决办法]
word 16bit
byte 8bit
明显错了