我写了一段代码用 C# 调用 c++ dll 结构体里面赋的值,带不出来代码如下c++#ifdef JWCARDI_EXPORTS
#define JWCARDI_API __declspec(dllexport)
#else
#define JWCARDI_API __declspec(dllimport)
#endif// TCM 基本信息结构体
typedef struct _BASE_TCM_INFO
{
char szTspFacturer[MAX_PATH];
char szTspVer[MAX_PATH];
char szTspFacturerId[MAX_PATH]; char szTcsFacturer[MAX_PATH];
char szTcsVer[MAX_PATH];
char szTcsFacturerId[MAX_PATH]; char szTcmFacturer[MAX_PATH];
char szTcmVer[MAX_PATH];
char szTcmFacturerId[MAX_PATH];}BASETCMINFO,*PBASETCMINFO;
JWCARDI_API UINT32 Jw_GetBaseTcmInfo(OUT PBASETCMINFO pBaseTcmInfo);c#调用代码 [StructLayout(LayoutKind.Sequential)]
public struct BASETCMINFO
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTspFacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTspVer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTspFacturerId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcsFacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcsVer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcsFacturerId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcmFacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcmVer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcmFacturerId;
} [DllImport(@"D:\DirectShow_work\vs2010\Bin\JwCardIDemo.dll")]
public extern static uint Jw_GetBaseTcmInfo(IntPtr pBaseTcmInfo);//调用代码如下
uint uRlt = 0; BASETCMINFO baseTcmInfo = new BASETCMINFO(); IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buf, 0); Marshal.StructureToPtr(baseTcmInfo, ptr, true); uRlt = Jw_GetBaseTcmInfo(ptr); BASETCMINFO baseTcmInfoR = (BASETCMINFO)Marshal.PtrToStructure(ptr, typeof(BASETCMINFO));baseTcmInfoR 里面的值一直是空的,但是如果直接用c++调用是可以的,Jw_GetBaseTcmInfo(ptr);这里调用也没有报错
谢谢大家帮忙看看!
#define JWCARDI_API __declspec(dllexport)
#else
#define JWCARDI_API __declspec(dllimport)
#endif// TCM 基本信息结构体
typedef struct _BASE_TCM_INFO
{
char szTspFacturer[MAX_PATH];
char szTspVer[MAX_PATH];
char szTspFacturerId[MAX_PATH]; char szTcsFacturer[MAX_PATH];
char szTcsVer[MAX_PATH];
char szTcsFacturerId[MAX_PATH]; char szTcmFacturer[MAX_PATH];
char szTcmVer[MAX_PATH];
char szTcmFacturerId[MAX_PATH];}BASETCMINFO,*PBASETCMINFO;
JWCARDI_API UINT32 Jw_GetBaseTcmInfo(OUT PBASETCMINFO pBaseTcmInfo);c#调用代码 [StructLayout(LayoutKind.Sequential)]
public struct BASETCMINFO
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTspFacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTspVer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTspFacturerId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcsFacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcsVer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcsFacturerId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcmFacturer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcmVer;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] szTcmFacturerId;
} [DllImport(@"D:\DirectShow_work\vs2010\Bin\JwCardIDemo.dll")]
public extern static uint Jw_GetBaseTcmInfo(IntPtr pBaseTcmInfo);//调用代码如下
uint uRlt = 0; BASETCMINFO baseTcmInfo = new BASETCMINFO(); IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buf, 0); Marshal.StructureToPtr(baseTcmInfo, ptr, true); uRlt = Jw_GetBaseTcmInfo(ptr); BASETCMINFO baseTcmInfoR = (BASETCMINFO)Marshal.PtrToStructure(ptr, typeof(BASETCMINFO));baseTcmInfoR 里面的值一直是空的,但是如果直接用c++调用是可以的,Jw_GetBaseTcmInfo(ptr);这里调用也没有报错
谢谢大家帮忙看看!
http://wenku.baidu.com/view/4011efa20029bd64783e2cc6.html我也不懂,最近在学习C++
[DllImport(@"D:\DirectShow_work\vs2010\Bin\JwCardIDemo.dll")]
public extern static uint Jw_GetBaseTcmInfo(out IntPtr pBaseTcmInfo);//调用代码如下
uint uRlt = 0; BASETCMINFO baseTcmInfo = new BASETCMINFO(); IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buf, 0); Marshal.StructureToPtr(baseTcmInfo, ptr, true); uRlt = Jw_GetBaseTcmInfo(out ptr);增加out 试试
托管调试助手“PInvokeStackImbalance”在“D:\DirectShow_work\vs2010\InvokeTCMandCardDLL\InvokeTCMandCardDLL\bin\Debug\InvokeTCMandCardDLL.vshost.exe”中检测到故障。
其他信息: 对 PInvoke 函数“InvokeTCMandCardDLL!InvokeTCMandCardDLL.InvokeFunction::Jw_GetBaseTcmInfo”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。