我要调用c++里的这个函数
char* BuildPackage(int &nPackageLen,int nSerialNo, byte byFlag, _int64  HostID, _int64  DestID, 
byte byPkgType, short nFuncNum, int  nPkgDateLen, char* pszPkgDate, byte byVer = ENTP_PROTOCAL_VERSION,
char *pszPassword =NULL, short nReturnCode = 0,short nTpNum = 0, short nCpNum =0, char* pszAddtion=NULL);
我在c#调用如下:
[System.Runtime.InteropServices.DllImport("D:\\test\\bin\\Debug\\DiDiprotocald.dll", EntryPoint = "?BuildReponsePackage@CDiDiGateWayProtocal@@QAEPADAAHF@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern StringBuilder BuildPackage(string nPackageLen, int nSerialNo, byte byFlag, long HostID, long DestID, byte byPkgType, short nFuncNum, int nPkgDateLen, ref string pszPkgDate, byte byVer, ref string pszPassword, short nReturnCode, short nTpNum, short nCpNum, ref string pszAddtion);
小弟初来csdn没分。送不了分,请好心人帮帮忙!!!急。,。,万分感谢!

解决方案 »

  1.   

       public static extern StringBuilder BuildPackage(string nPackageLen,//能调成功才怪,这里是整型的引用
     int nSerialNo, byte byFlag, long HostID, long DestID, byte byPkgType, short nFuncNum, int nPkgDateLen, ref string pszPkgDate, byte byVer, ref string pszPassword, short nReturnCode, short nTpNum, short nCpNum, ref string pszAddtion); 
      

  2.   

    现在已经基本可以确认是 int &nPackageLen  这个转换出错了 ,但不知道这个参数在C#里应该用什么来代替看别人的帖子上的 都是 指针类型的转换 这个好像没看到有!大侠们 帮帮忙啊!
      

  3.   

    lianshaohua   兄台 说说你觉得这里应该怎么用!!!
      

  4.   

    http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120
      

  5.   

    我怎么看着两个参数列表不一样 而且int &nPackageLen 这是个int的指针吧 
      

  6.   

    我现在改成下面那样了还是不行,报同样的错。高手进来帮帮忙啊!
    public static extern StringBuilder BuildPackage(ref int nPackageLen, int nSerialNo, byte byFlag, long HostID, long DestID, byte byPkgType, short nFuncNum, int nPkgDateLen, StringBuilder pszPkgDate, byte byVer, StringBuilder pszPassword, short nReturnCode, short nTpNum, short nCpNum, StringBuilder pszAddtion);
      

  7.   

    现在问题变了,但一样出现相同的错,问题如下:
    调用 BuildPackage(char *&ptrPackageOutput,int &nPackageLen,int nSerialNo,byte Flag, char *chDESPassword,short shTPNum,short shCPNum,char *VIN, byte PackageType,short shFunctionNo,short shReturnCode, int nDataLength,char *ptrData)
     填入必要参数(有的参数可以为空),成功建立后会将结果返回到ptrPackageOutput(指明包起始地址)和nPackageLen(指明报长度);我在C#里面调用如下:
     [System.Runtime.InteropServices.DllImport("D:\\test\\bin\\Debug\\ProtocolAnalysorLib.dll", EntryPoint = "?BuildPackage@CProtocolAnalysor@ASNS@@QAEPADAAHHEPADFF1EFFH1@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public static extern void BuildPackage([Out] StringBuilder ptrPackageOutput,[Out] IntPtr nPackageLen,int nSerialNo,byte Flag,string chDESPassword,short shTPNum,short shCPNum,string VIN,byte PackageType,short shFunctionNo,short shReturnCode,int nDataLength,string ptrData);高手进来帮帮忙 我怀疑出错的就是那2个输出的参数,不知道怎么弄
      

  8.   


    [Out] StringBuilder ptrPackageOutput,
    换成
    string ptrPackageOutput
    试试.既然你能更改C++中Dll文件中的代码, 那就将前面两个输出参数分开来测试一下. 这样会使你更容易找到出错的原因.
      

  9.   

    public static extern StringBuilder BuildPackage(out string ptrPackageOutput, out int nPackageLen, int nSerialNo, byte Flag, string chDESPassword, short shTPNum, short shCPNum, string VIN, byte PackageType, short shFunctionNo, short shReturnCode, int nDataLength, string ptrData);    
    改成这样也不行
      

  10.   

    哎终于弄出来了!结帖散分拉正确的结果是:
    public static extern System.IntPtr BuildPackage(out int nPackageLen, int nSerialNo, System.Byte Flag, System.IntPtr chDESPassword, short shTPNum, short shCPNum, System.IntPtr VIN, System.Byte PackageType, short shFunctionNo, short shReturnCode, int nDataLength, System.IntPtr ptrData);