c++中的定义是这样的:
struct BASEOPTIONS 
{
int  nBCStyle;      
BYTE *  lpszBCData; 
Int   nLens;
int  nPrinterDpi;
BOOL  bStandard;
BYTE  Reversed[10]; 
}
我现在的定义是这样的:
        public struct BASEOPTIONS
        {
            public IntPtr nBCStyle;
            public string lpszBCData;
            public int nLens;
            public int nPrinterDpi;
            public bool bStandard;
            public byte[] Reversed ;
        }
在用到这个结构的时候报错:检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“PCApp!PCApp.clsPrint::SetBCBaseParam”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。应该怎么定义呢?我认为是最后一个参数的问题,BYTE Reversed[10];请教高人,应该怎么定义呢?

解决方案 »

  1.   

    指针在C#中应该是 IntPtr 类型
      

  2.   

      
     public struct BASEOPTIONS
        {
            public IntPtr nBCStyle;
            public string lpszBCData;
            public int nLens;
            public int nPrinterDpi;
            public bool bStandard;
            public byte[] Reversed;
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                BASEOPTIONS b;
                b.Reversed = new byte[10];        }
        }
    给数组初始化一下
      

  3.   

    谢谢!
    把byte[] Reversed 改为IntPtr Reversed也不行,或者是不应该这样改?
      

  4.   

    谢谢。我按liuyileneal的改法,也不行,还是一样的错误。
      

  5.   

     public unsafe struct BASEOPTIONS
            {
                public fixed byte Reversed[10];
    }
      

  6.   

    我感觉你的问题可能不是出在定义上,可能是出在调用方面。
    正常的调用应该如下这种方式:
    class MyClass
        {
            MyStruct ms = new MyStruct();  //可以NEW  也可以不用NEW
            MyStruct ms;                   //系统总是提供无参构造
            public void PrintName()
            {
                ms.name="Hello!";          //方法中赋值
                Console.Write(ms.name);    
            }
        }
      

  7.   

            public struct BASEOPTIONS
            {
                public int nBCStyle;
                public string lpszBCData;
                public int nLens;
                public int nPrinterDpi;
                public FontStruct szFont;
                public bool bStandard;
                public fixed byte Reversed[10] ;
            }
    改成这样的话,在这一句public fixed byte Reversed[10] 的public上提示错误:
    指针和固定大小缓冲区只能在不安全的上下文中使用
      

  8.   

    如果加上unsafe即:        public unsafe struct BASEOPTIONS
    又提示:不安全代码只会在使用 /unsafe 编译的情况下出现
      

  9.   

    public unsafe struct BASEOPTIONS
    {
    public fixed byte Reversed[10];
    }项目--属性--生成--勾选 允许不安全代码
      

  10.   


    谢谢,确实要new,不然会提示使用了未赋值的变量。我是这要调用的:
            public struct BASEOPTIONS
            {
                public int nBCStyle;
                public string lpszBCData;
                public int nLens;
                public int nPrinterDpi;
                public FontStruct szFont;
                public bool bStandard;
                public byte[] Reversed ;
            }public bool Print()
    {
                BASEOPTIONS bo = new BASEOPTIONS();
                bo.nBCStyle = 0;
                bo.lpszBCData = "123432423432";
                bo.nLens = bo.lpszBCData.Length;
                bo.bStandard = false;
                bo.nPrinterDpi = 600;
                bo.Reversed = new byte[10];
                SetBCBaseParam(bo);
    }
    另外,SetBCEachParam的声明这样的:
            public static extern bool SetBCBaseParam(BASEOPTIONS pBaseOption);
      

  11.   

    谢谢你们。允许不安全代码后:
            public unsafe struct BASEOPTIONS
            {
                public int nBCStyle;
                public string lpszBCData;
                public int nLens;
                public int nPrinterDpi;
                public FontStruct szFont;
                public bool bStandard;
                public fixed byte Reversed[10] ;
            }
    public bool Print()
    {
    BASEOPTIONS bo = new BASEOPTIONS();
    bo.nBCStyle = 0;
    bo.lpszBCData = "123432423432";
    bo.nLens = bo.lpszBCData.Length;
    bo.bStandard = false;
    bo.nPrinterDpi = 600;SetBCBaseParam(bo);
    }这样还是报同样的错。
      

  12.   

    其它它有一个VB的参考例子:
      type
          BASEOPTIONS = record
          nBCStyle : Integer;
          lpszBCData : PBYTE;
          nLens : Integer;
          nPrinterDpi : Integer;
          bStandard:boolean;
          Reversed:array[1..10] of byte;
      end;    base.nBCStyle := 0 ;
        base.lpszBCData := PBYTE(strCodeMsg);
        base.nLens := Length(strCodeMsg);
        base.bStandard := false;
        base.nPrinterDpi := 600 ;
      

  13.   

    public unsafe struct BASEOPTIONS
    {
    public int nBCStyle;
    public IntPtr lpszBCData;
    public int nLens;
    public int nPrinterDpi;
    public FontStruct szFont;
    public bool bStandard;
    public fixed byte Reversed[10] ;
    }
    public bool Print()
    {
    string s= "123432423432";
    BASEOPTIONS bo = new BASEOPTIONS();
    bo.nBCStyle = 0;
    bo.lpszBCData =  System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(s);
    bo.nLens = s.Length;
    bo.bStandard = false;
    bo.nPrinterDpi = 600;SetBCBaseParam(bo);
    }这样试试,lpszBCData 是个指向字符串的指针
      

  14.   


    谢谢,还是不行。
    上面给的是DELPHI的,VB的参考是这样的:
    Private Type BASEOPTIONS
        nBCStyle As Long
        lpszBCData As String
        nLens As Long
        nPrinterDpi As Long
        bStandard As Boolean
        Reversed(1 To 10) As Long
    End Type
        Dim base As BASEOPTIONS
       '对结构进行赋值
        strMsg = txtBCData.Text
        base.nBCStyle = 0
        base.lpszBCData = strMsg
        base.nLens = Len(strMsg)
        base.bStandard = False
        base.nPrinterDpi = 600
      

  15.   

    对了,我这样声明函数不知道对不对,
            //SetBCBaseParam
            [DllImport("NlsCodeMid.dll", CharSet = CharSet.Ansi)]
            public static extern bool SetBCBaseParam(BASEOPTIONS pBaseOption);
    在C++中的定义是这样的:
    BOOL SetBCBaseParam(BASEOPTIONS * pBaseOption)
      

  16.   

    把.h中SetBCBaseParam的声明和VB中调用SetBCBaseParam的部分也贴出来看看
      

  17.   

    [DllImport("NlsCodeMid.dll", CharSet = CharSet.Ansi)]
    public static extern bool SetBCBaseParam(ref BASEOPTIONS pBaseOption);用ref,传地址