我写了一段代码用 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);这里调用也没有报错
谢谢大家帮忙看看!

解决方案 »

  1.   

    http://blog.csdn.net/sunboyljp/archive/2009/12/31/5110639.aspx
    http://wenku.baidu.com/view/4011efa20029bd64783e2cc6.html我也不懂,最近在学习C++
      

  2.   


            [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  试试
      

  3.   


    托管调试助手“PInvokeStackImbalance”在“D:\DirectShow_work\vs2010\InvokeTCMandCardDLL\InvokeTCMandCardDLL\bin\Debug\InvokeTCMandCardDLL.vshost.exe”中检测到故障。
    其他信息: 对 PInvoke 函数“InvokeTCMandCardDLL!InvokeTCMandCardDLL.InvokeFunction::Jw_GetBaseTcmInfo”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
      

  4.   

    应该是.NET调用下的PInvoke 函数签名与C++提供的dll不匹配,可能是参数类型。
      

  5.   

    不是不匹配的愿意?我想问下 如果c++ 里面不加 __stdcall 有影响吗?