今天把程序升级到VS2005,原来在VS2003下正常的调用,在VS2005下出错.
是一个调用VC++写的DLL的函数,郁闷!!!
错误提示:对 PInvoke 函数“grm!grm.encrypt::DecodeKey”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。VC++中原型:DecodeKey(char * Code, char * Key, char * Result,long file)
           CodeKey(char * Code, char * Key, char * Result,long file)VS2003是这样申明的:
[DllImport("xcode.dll", CharSet = CharSet.Ansi)] 
public static extern void DecodeKey(StringBuilder as_input,StringBuilder as_key,StringBuilder as_output, [MarshalAs(UnmanagedType.I8)]long as_file); 
[DllImport("xcode.dll", CharSet = CharSet.Ansi)] 
public static extern void CodeKey(StringBuilder as_input,StringBuilder as_key,StringBuilder as_output, [MarshalAs(UnmanagedType.I8)]long as_file); 
在VS2003下正常调用,升级的VS2005后报上诉错误.

解决方案 »

  1.   

    对vs2005,目前还没有研究到调用C++的dll这么深入的问题,所以偶帮不上忙,估计能帮上的不多,lz耐心等候高手出现~~~
      

  2.   

    CodeKey(char * Code, char * Key, char * Result,long file)此函数各个参数的IN 或者Out 有规定吗?
      

  3.   

    给个例子给你:
    Mydll中函数原形是
    void ReadValue (/*IN*/const wchar_t* Section,/*IN*/const wchar_t* Key,/*IN*/unsigned long ulValueLength,/*OUT*/wchar_t* chValue);[DllImport("Mydll.dll", CharSet = CharSet.Unicode, EntryPoint = "ReadValue")]
    public static extern void ReadValue (String Section, String Key, UInt32 valueLength, StringBuilder chValue );传回的参数需要用StringBuilder类型
      

  4.   

    DecodeKey(char * Code, char * Key, char * Result,long file)
    我只知道Result是返回的结果.其它的应该是输入的参数.
      

  5.   

    Have a try!
    [DllImport("xcode.dll")]
    public static extern void DecodeKey([In]StringBuilder as_input,[In]StringBuilder as_key,[Out]StringBuilder as_output, [MarshalAs(UnmanagedType.I8)]long as_file);
    [DllImport("xcode.dll")]
    public static extern void CodeKey([In]StringBuilder as_input,[In]StringBuilder as_key,[Out]StringBuilder as_output, [MarshalAs(UnmanagedType.I8)]long as_file);
      

  6.   

    平台调用不需要使用[IN] [OUT],如果是COM组件才需要。
    应该是long在当时是32位的,而非64位
    可以改成System.Int32传入
      

  7.   

    我知道的是对BS程序,vs2003和vs2005差距还是很大的,增加好多控件,代码分离,还有页面不是codebehind,是什么behindfile好像,有点记不清了,大的系统靠它自动转换是够呛了
      

  8.   

    你在VS下声明的函数和VC++不匹配。VS2003的检查不是太严格,所以能通过。VS2005的检查更严格了。
    我遇过好几次这样的问题(2003下正常,2005下报错),最后发现都是自己的问题