c#中如何调用C++做的DLL中的结构体?解决可追加50分!!!

typedef struct _VID_PID_MANUFACTURER_PRODUCT
{
USHORT PID;
USHORT VID;
WCHAR Manufacturer[128];
WCHAR Product[128];
}Info,* pInfo;
请问,如何将这个结构体在C#中表示?

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct _VID_PID_MANUFACTURER_PRODUCT
{
// public MsgHeader Header;
public Int16 PID;
public Int16 VID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Manufacturer;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Product;
}
如果用这个结构体是用SOCKET来传包的话 你还需要在里面带上头 就是上面被注释掉的.. 其中MsgHeader为头结构体追问

就是我在类里面声明了这个结构体,做成类库,然后作为一个函数的参数,在别的程序里面引用这个DLL

追答

哦 那就可以直接用 不用头了 结构体前面+public :
public struct _VID_PID_MANUFACTURER_PRODUCT
{
//上面的
}
你可以试试看

_VID_PID_MANUFACTURER_PRODUCT product=new _VID_PID_MANUFACTURER_PRODUCT();

product.PID=0X000;
..................
等等........属性

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-10
struct info
{
public ushort PID;
public ushort VID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public char []Manufacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public char []Product;
}

*pInfo可以用IntPtr来代替。主要看你怎么用追问

不行啊!!

追答

怎么不行,这个要看你怎么用的,如果你用错了,那肯定不行的。跟C++直接调用是有区别的。如果你是做参数,而且是输出的话,那可以在参数前面加ref 或out。

追问

就是我在类里面声明了这个结构体,做成类库,然后作为一个函数的参数,在别的程序里面引用这个DLL。而且这个info怎么用intPtr来代替呢?

追答

这样不用IntPtr,如果输入的话,你直接用info就可以了,如果是输出的话,那就要再加ref 或out,只有这样才能把参数内容输出

追问

我的dll中是这个函数
public class FXSpectrometer : Component
{
struct info
{
……//省略
}
public int GetSpectrometerInfo(IntPtr hDevice, ref info inf )
}
在使用的程序中中
{
FXSpectrometer.info inf = new FXSpectrometer.info();
int z = fxSpectrometer1.GetSpectrometerInfo(hDevice, ref inf);
}

追答

GetSpectrometerInfo(Info hDevice, ref info inf )
直接这样不就行了吗,干嘛一定要用IntPtr,这里都不用它
还要上面的那个函数是在C#里面啊,不是在C++里面啊,如果是引用C++ DLL的函数好像要用DllImport来引入啊,就好像C#使用API一样
你最好把错误提示发上来,不然不知道你错在哪里

第2个回答  2012-04-10
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class _VID_PID_MANUFACTURER_PRODUCT
{
public int PID;
public int VID;
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=128)]
public string Manufacturer;
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=128)]
public string Product;
}
第3个回答  2012-04-10
你在C#里面写个结构体不就好了,
C#结构体和C++比 少个别名;
相似回答