c#调用dll动态库的问题

三江831 2012-11-13 11:31:27
dll动态库里的函数,但是我在C#程序里声明后,无法调用,说函数不存在!
函数的C++原型如下:
LONG HB_SDVR_Login_Ex_Nvs(
char *sDVRIP,
WORD wDVRPort,
char *sUserName,
char *sPassword,
LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo
);
typedef struct {
BYTE sSerialNumber[SERIALNO_LEN];
BYTE byAlarmInPortNum;
BYTE byAlarmOutPortNum;
BYTE byDiskNum;
BYTE byDVRType;
BYTE byChanNum;
BYTE byStartChan;
BYTE sDvrName[NAME_LEN];
BYTE sChanName[MAX_CHANNUM_EX][NAME_LEN];
} HB_SDVR_DEVICEINFO_EX, *LPHB_SDVR_DEVICEINFO_EX;
我在C#里定义如下:
public struct LPHB_SDVR_DEVICEINFO_EX
{
public byte[] sSerialNumber;
public byte byAlarmInPortNum;
public byte byAlarmOutPortNum;
public byte byDiskNum;
public byte byDVRType;
public byte byChanNum;
public byte byStartChan;
public byte[] sDvrName;
public byte[][] sChanName;
}

[DllImport("7000sdk.dll")]
public static extern long HB_SDVR_Login_Ex_Nvs(string sDVRIP, UInt16 wDVRPort, string sUserName, string sPassword, LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo);
...全文
202 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
三江831 2012-11-14
  • 打赏
  • 举报
回复
再次修改,这回对了。6楼说的对:数组类型的定义一定要指定大小!!! public struct LPHB_SDVR_DEVICEINFO_EX { [MarshalAs(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN)] public byte[] sSerialNumber; public byte byAlarmInPortNum; public byte byAlarmOutPortNum; public byte byDiskNum; public byte byDVRType; public byte byChanNum; public byte byStartChan; [MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN)] public byte[] sDvrName; [MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_LEN * MAX_CHANNUM_EX)] public byte[] sChanName; } [DllImport("7000sdk.dll")] public static extern long HB_SDVR_Login_Ex_Nvs(string sDVRIP, UInt16 wDVRPort, string sUserName, string sPassword, ref LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo);
三江831 2012-11-14
  • 打赏
  • 举报
回复
修改了封送定义,但是还是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 public struct LPHB_SDVR_DEVICEINFO_EX { public byte[] sSerialNumber; public byte byAlarmInPortNum; public byte byAlarmOutPortNum; public byte byDiskNum; public byte byDVRType; public byte byChanNum; public byte byStartChan; public byte[] sDvrName; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)] public byte[] sChanName; } [DllImport("7000sdk.dll")] public static extern long HB_SDVR_Login_Ex_Nvs(string sDVRIP, UInt16 wDVRPort, string sUserName, string sPassword, ref LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo);
mjp1234airen4385 2012-11-13
  • 打赏
  • 举报
回复
你这样的参数封送方法不对。 结构体定义也不对。 LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo ); 这个参数使用intptr试试,然后,定义的结构,转化为指针,在传入。 public byte[] sSerialNumber; 数组类型的定义一定要指定大小,还可以使用未托管数据类型定义试试。 也可以不定义结构类型,LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo 这个参数直接定义为指针以后,在返回的数据中按C++那个结构体数据类型大小从内存地址取数据, 一样可以得到数据。
conan8126 2012-11-13
  • 打赏
  • 举报
回复
[DllImport("7000sdk.dll")]
public static extern long HB_SDVR_Login_Ex_Nvs(string sDVRIP, UInt16 wDVRPort, string sUserName, string sPassword, LPHB_SDVR_DEVICEINFO_EX lpDeviceInfo);
参数类型有没有问题?
BingZhenPiJiu 2012-11-13
  • 打赏
  • 举报
回复
拜读,学习了,谢谢
三江831 2012-11-13
  • 打赏
  • 举报
回复
感谢回复! debug下有指定的dll文件。刚才我自己用vc++2005生成了一个dll,里边写了一个简单的函数,用C#可以调用,但是那个动态库(7000sdk.dll),还是不能调用。
心灵彩虹 2012-11-13
  • 打赏
  • 举报
回复
[DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性 [DllImport(“dll名字.dll", EntryPoint=" c++的方法名字",CharSet=CharSet.Auto)
心灵彩虹 2012-11-13
  • 打赏
  • 举报
回复
运行目录有没有c++的dll啊?bin/dubug目录下

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧