首页 新闻 会员 周边 捐助

C#如何调用c++中定义的函数并传入结构体?

0
[已关闭问题] 关闭于 2016-11-30 14:59

以下为C++中定义的函数及结构体:

typedef struct
{
char cSerial[8];
char userNo[7]; 
char userName[33]; 
char unitNo[13]; 
char unitName[33]; 
}Y_INFO;

 

以下是在VC中定义的方法

unsigned char WriteInfo(Y_INFO *info,unsigned short int *iRet)

参数说明:

Y_INFO *info:输入参数
*iRet :为输出参数

以下为我在c#中定义的代码
public struct Y_INFO
{
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
 public string cSerial;
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 7)]
 public string userNo;
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
 public string userName;
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
 public string unitNo;
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
 public string unitName;
}

这是调用的方法声明:

        [DllImport("EDV.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "WriteZFYInfo")]
        public static extern bool WriteZFYInfo(ZFY_INFOX info, string sPwd, ref int iRet);

以下为方法的调用:

复制代码
                Y_INFO wIn;
                wIn.cSerial = "W00000";
                wIn.userNo = "123456";
                wIn.userName = "";
                wIn.unitNo = "";
                wIn.unitName = "";
                var winfo = WriteZFYInfo(wIn, pwd, ref iRet);
复制代码

执行时出错了,错误提示为:

其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

 

各位大大帮我看一下,我是哪个地方出了问题?是赋值吗,还是什么原因的?

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]

结构体的类型我全部都试过了,什么:ByValTStr,BStr,LPTStr,LPWStr,LPStr全部试过一次了,还是不行!!!实在很崩溃!

denli的主页 denli | 初学一级 | 园豆:19
提问于:2016-11-30 14:03
< >
分享
所有回答(2)
0

一般遇到这样的问题是C++和C#的类型定义不同。比如c++中的类型short, short int, INT16, SHORT 在 c#中为System.Int16。

1006038080 | 园豆:202 (菜鸟二级) | 2016-11-30 14:33
0

已经摸索着解决了!

denli | 园豆:19 (初学一级) | 2016-11-30 14:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册