今天把程序升级到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后报上诉错误.
是一个调用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后报上诉错误.
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类型
我只知道Result是返回的结果.其它的应该是输入的参数.
[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);
应该是long在当时是32位的,而非64位
可以改成System.Int32传入
我遇过好几次这样的问题(2003下正常,2005下报错),最后发现都是自己的问题