首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求教一个C#引用C++DIl 做接口的有关问题

2013-09-05 
求教一个C#引用C++DIl 做接口的问题,高手请进先来短代码WORD __stdcall LMMTP_WrapMessageProperty(DWORD

求教一个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
明显错了

热点排行