C#调用DLL的问题(如何以传址方式传递一个结构数组?) 上面这样做是不行的,因为在定义的DLL中只会认为你是传递一个结构,我要的是传递一个结构数组 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 dll 声明[dllimport.... ]int gsmParseMessageList(IntPtr pMsg)调用SM_PARAM[] arr = ....IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement ( arr,0);gsmParseMessageList( ptr ); 我刚试了,可以调用,谢谢各位,但是,我一运行就提示:"未处理AccessViolationException,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。",请问如何解决?谢谢! hdt大哥,请问要改哪里阿?麻烦您了,可说明一下吗,非常感谢!这是我在C#中的STRUCTpublic struct SM_PARAM{ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string SCA; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string TPA; public char TP_PID; public char TP_DCS; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string TP_SCTS; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)] public string TP_UD; short index;}; C++的STRUCT声明是这样的:typedef struct { char SCA[16]; char TPA[16]; char TP_PID; char TP_DCS; char TP_SCTS[16]; char TP_UD[160]; short index; } SM_PARAM; 定义方式:[DllImport("D:\\DLL\\temp\\Debug\\mmt.dll")]public static extern int gsmParseMessageList (ref SM_PARAM msg);调用方式:SM_PARAM [] msg=new SM_PARAM [10] ;gsmParseMessageList( ref msg[0]);试试,有奇效 以前遇到过,最后用unsafe解决。 try[StructLayout(LayoutKind.Sequential )]public class SM_PARAM{ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string SCA; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string TPA; public char TP_PID; public char TP_DCS; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string TP_SCTS; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)] public string TP_UD; short index;};函数定义[DllImport("your.DLL", CharSet=CharSet.ANSI )]int gsmParseMessageList(IntPtr pMsg); 小弟在此谢过各位大哥了,尤其是hdt大哥,我刚试了,还是会出现"未处理AccessViolationException,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。",看来只能用UNSAFE了,非常感谢各位 KingDomgps大哥,你的方法我也试过了,的确好用,不过还是会出现这个问题,因为我要返回多个值,将结果返回到SM_PARAM结构,所以不是因为我在gsmParseMessageList中修改了SM_PARAM结构引起这个错误? KingDomgps大哥,是不是我这里SM_PARAM [] msg=new SM_PARAM [10] ;gsmParseMessageList( ref msg[0]);有什么问题? 牵强付会,用C++就用C++,用CSharp就用Csharp,互操作是微软向下兼容的策略,为什么不把时间放在上面 在你的结构体定义前面加上[StructLayout(LayoutKind.Sequential )]然后再试试把你的数组改大一点传进去试试,有可能是数组越界哦 “未处理AccessViolationException,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”这样的错误应该是数据保护。最近也遇到过类似问题,不过是c++调用delphi的时候出现的。你尝试一下在C#内使用Array.Clear(test,0,65536);先清零数据。在C++中使用 void * 作为形参,然后c++内所有操作使用 强制类型转换后的指针自增、自减操作来完成。不知道这样的方式是否可以解决你的问题。 多谢名位的帮助,还是上面那位兄弟说得对,以前为了兼容别人做的DLL没办法,不过发现在C#这样调用太没效率,还是用C#自己重做吧. 感谢26楼的朋友,解决了我的问题。[DllImport("***.dll")] public static extern short ReadRecord(IntPtr hCom, byte Adr, byte Cmd, ref RecordS Record, string FileName, byte Bz);这个方法是批量读取,Record返回的是一个结构数组 传数组的第一个元素是正解ref Record[0] C#结构数组!还来个指针!...这段用C吧C#不合适.. C#自定义控件的集合属性怎么搞?求指点 winform的图片和文字显示问题 C#窗体初始化时,改变透明度,运行时怎么会卡卡的? sqldatareader关闭问题 RMB求用C#写一流程控制解释(执行)器 求:C#版 TreeView 建立部门树的实例 怎么从一个字符型数据信息再还原到原来的类的对象? OnKeyDown重载函数,在线等待,谢谢! 事件之间传递消息怎么做到? List<>可以在某个位置插入元素吗? c#操作word,分页的问题~在线等~~~ C#中如何在菜单中添加快捷键
[dllimport.... ]
int gsmParseMessageList(IntPtr pMsg)
调用
SM_PARAM[] arr = ....
IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement ( arr,0);
gsmParseMessageList( ptr );
public struct SM_PARAM
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string SCA;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string TPA;
public char TP_PID;
public char TP_DCS;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string TP_SCTS;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
public string TP_UD;
short index;
};
typedef struct {
char SCA[16];
char TPA[16];
char TP_PID;
char TP_DCS;
char TP_SCTS[16];
char TP_UD[160];
short index;
} SM_PARAM;
[DllImport("D:\\DLL\\temp\\Debug\\mmt.dll")]
public static extern int gsmParseMessageList (ref SM_PARAM msg);调用方式:
SM_PARAM [] msg=new SM_PARAM [10] ;
gsmParseMessageList( ref msg[0]);试试,有奇效
[StructLayout(LayoutKind.Sequential )]
public class SM_PARAM
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string SCA;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string TPA;
public char TP_PID;
public char TP_DCS;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string TP_SCTS;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
public string TP_UD;
short index;
};
函数定义
[DllImport("your.DLL", CharSet=CharSet.ANSI )]
int gsmParseMessageList(IntPtr pMsg);
SM_PARAM [] msg=new SM_PARAM [10] ;
gsmParseMessageList( ref msg[0]);
有什么问题?
然后再试试把你的数组改大一点传进去试试,有可能是数组越界哦
先清零数据。
在C++中使用 void * 作为形参,然后c++内所有操作使用 强制类型转换后的指针自增、自减操作来完成。不知道这样的方式是否可以解决你的问题。
[DllImport("***.dll")]
public static extern short ReadRecord(IntPtr hCom, byte Adr, byte Cmd, ref RecordS Record, string FileName, byte Bz);
这个方法是批量读取,Record返回的是一个结构数组 传数组的第一个元素是正解ref Record[0]
C#不合适..