问个关于C++的dll转换成C#的问题,使用DllImport

zjjking 2009-06-10 08:40:11
我有个dll(Prodave6.dll)里一个函数定义如下
int LoadConnection_ex6 (int ConNr, char* pAccessPoint, int ConTableLen,CON_TABLE_TYPE * pConTable);
其中,
typedef union {
unsigned char Mpi; // MPI/PB station address (2)
unsigned char Ip[4]; // IP address (192.168.0.1)
unsigned char Mac[6]; // MAC address (08-00-06-01-AA-BB)
} CON_ADR_TYPE;
typedef struct {
CON_ADR_TYPE Adr; // connection address
unsigned char AdrType; // Type of address: MPI/PB (1), IP (2), MAC (3)
unsigned char SlotNr; // Slot number
unsigned char RackNr; // Rack number
} CON_TABLE_TYPE;

(1)我自己写的是
[DllImport("Prodave6.dll")]
public extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen,ref CON_TABLE_TYPE[] pConTable);
不知道对不对,还有union 怎么转换成c#的?
(2)目前我结构体用C#写成的是:
[StructLayout(LayoutKind.Explicit)]
public struct CON_ADR_TYPE
{
[FieldOffset(0)] public System.Byte Mpi; // MPI/PB station address (2)
[FieldOffset(0)]
public Byte[] Ip; // IP address (192.168.0.1)
[FieldOffset(0)]
public Byte[] Mac; // MAC address (08-00-06-01-AA-BB)
public CON_ADR_TYPE(object ob)
{
Ip = new Byte[4];
Mac = new Byte[6];
}
}

public struct CON_TABLE_TYPE
{
public CON_ADR_TYPE Adr; // connection address
public byte AdrType; // Type of address: MPI/PB (1), IP (2), MAC (3)
public byte SlotNr; // Slot number
public byte RackNr; // Rack number
}

这个是有问题的,特别是关于CON_ADR_TYPE这个共用体的重写绝对有问题!到底要怎么写呢?
...全文
241 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjjking 2009-06-11
  • 打赏
  • 举报
回复
呵呵,最后还是参考别人的,共用体不用搞这么复杂,直接里面就定义
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
// MPI/PB station address (2)
// IP address (192.168.0.1)
// MAC address (08-00-06-01-AA-BB)
public Byte[] Address;
就好了
zjjking 2009-06-10
  • 打赏
  • 举报
回复
大侠,我改成如下的样子:
[StructLayout(LayoutKind.Explicit)]
public struct CON_ADR_TYPE
{
[FieldOffset(0)] public System.Byte Mpi; // MPI/PB station address (2)
[FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public Byte[] Ip; // IP address (192.168.0.1)
[FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public Byte[] Mac; // MAC address (08-00-06-01-AA-BB)
public CON_ADR_TYPE(object ob)
{
Ip = new Byte[4];
Mac = new Byte[6];
Mpi = 0;
}

}

还是报错了,错误如下:
未处理的“System.TypeLoadException”类型的异常出现在 mscorlib.dll 中。

其他信息: 未能从程序集“Prodave6_CS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“CON_ADR_TYPE”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。
peterb 2009-06-10
  • 打赏
  • 举报
回复
unsigned char Mac[6]; // MAC address (08-00-06-01-AA-BB)
数组一般需要指定大小
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Mac;

给你几篇文章参考,P/Invoke使用Win32非托管函数2
P/Invoke使用Win32非托管函数3
怎样在C#里面运用 Win32和其余库
C#封装的海康DVR客户端SDK
zjjking 2009-06-10
  • 打赏
  • 举报
回复
这个没有人搞过吗?
zjjking 2009-06-10
  • 打赏
  • 举报
回复
天啊,救命啊!

110,535

社区成员

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

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

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