C#项目中发生PInvokeStackImbalance异常,堆栈不对称异常

来源:互联网 发布:防止软件自动安装 编辑:程序博客网 时间:2024/05/18 00:55

在项目中嵌入视频播放软件时,系统中提示堆栈不对称异常。

当修改DLL为动态导入时,即将[DllImport(“libvlc”)]修改为[DllImport(“libvlc”, CharSet = ChartSet.Ansi,CallingConvention = CallingConvention.cdecl)]上述异常就会消失,但是接着就会报出异常:未处理EntryPointNotFoundException异常。在DLL“XXX”中找不到“YYY”的入口点。如下图所示:


要解决掉上述异常需要对入口的参数的类型进行转换,将int**修改为ref intPtr;将char* 改为StringBuilding即可。



另外,此处给出C++参数类型与C#相应类型对比表:

  1. //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试  
  2.  c++:HANDLE(void *) ---- c#:System.IntPtr    
  3.  c++:Byte(unsigned char) ---- c#:System.Byte    
  4.  c++:SHORT(short) ---- c#:System.Int16    
  5.  c++:WORD(unsigned short) ---- c#:System.UInt16    
  6.  c++:INT(int) ---- c#:System.Int16  
  7.  c++:INT(int) ---- c#:System.Int32    
  8.  c++:UINT(unsigned int) ---- c#:System.UInt16  
  9.  c++:UINT(unsigned int) ---- c#:System.UInt32  
  10.  c++:LONG(long) ---- c#:System.Int32    
  11.  c++:ULONG(unsigned long) ---- c#:System.UInt32    
  12.  c++:DWORD(unsigned long) ---- c#:System.UInt32    
  13.  c++:DECIMAL ---- c#:System.Decimal    
  14.  c++:BOOL(long) ---- c#:System.Boolean    
  15.  c++:CHAR(char) ---- c#:System.Char    
  16.  c++:LPSTR(char *) ---- c#:System.String    
  17.  c++:LPWSTR(wchar_t *) ---- c#:System.String    
  18.  c++:LPCSTR(const char *) ---- c#:System.String    
  19.  c++:LPCWSTR(const wchar_t *) ---- c#:System.String    
  20.  c++:PCAHR(char *) ---- c#:System.String    
  21.  c++:BSTR ---- c#:System.String    
  22.  c++:FLOAT(float) ---- c#:System.Single    
  23.  c++:DOUBLE(double) ---- c#:System.Double    
  24.  c++:VARIANT ---- c#:System.Object    
  25.  c++:PBYTE(byte *) ---- c#:System.Byte[]    
  26.   
  27.   
  28.  c++:BSTR ---- c#:StringBuilder  
  29.  c++:LPCTSTR ---- c#:StringBuilder  
  30.  c++:LPCTSTR ---- c#:string  
  31.  c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string    
  32.  c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名  
  33.  c++:LPCWSTR ---- c#:IntPtr  
  34.  c++:BOOL ---- c#:bool     
  35.  c++:HMODULE ---- c#:IntPtr     
  36.  c++:HINSTANCE ---- c#:IntPtr    
  37.  c++:结构体 ---- c#:public struct 结构体{};    
  38.  c++:结构体 **变量名 ---- c#:out 变量名 //C#中提前申明一个结构体实例化后的变量名  
  39.  c++:结构体 &变量名 ---- c#:ref 结构体 变量名  
  40.      
  41.   
  42.   
  43.  c++:WORD ---- c#:ushort  
  44.  c++:DWORD ---- c#:uint  
  45.  c++:DWORD ---- c#:int  
  46.   
  47.   
  48.  c++:UCHAR ---- c#:int  
  49.  c++:UCHAR ---- c#:byte  
  50.  c++:UCHAR* ---- c#:string  
  51.  c++:UCHAR* ---- c#:IntPtr  
  52.   
  53.   
  54.  c++:GUID ---- c#:Guid  
  55.  c++:Handle ---- c#:IntPtr  
  56.  c++:HWND ---- c#:IntPtr  
  57.  c++:DWORD ---- c#:int  
  58.  c++:COLORREF ---- c#:uint  
  59.   
  60.   
  61.  c++:unsigned char ---- c#:byte  
  62.  c++:unsigned char * ---- c#:ref byte  
  63.  c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]  
  64.  c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr  
  65.   
  66.   
  67.  c++:unsigned char & ---- c#:ref byte  
  68.  c++:unsigned char 变量名 ---- c#:byte 变量名  
  69.  c++:unsigned short 变量名 ---- c#:ushort 变量名  
  70.  c++:unsigned int 变量名 ---- c#:uint 变量名  
  71.  c++:unsigned long 变量名 ---- c#:ulong 变量名  
  72.   
  73.   
  74.  c++:char 变量名 ---- c#:byte 变量名 //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示  
  75.  c++:char 数组名[数组大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)] public string 数组名; ushort  
  76.   
  77.   
  78.  c++:char * ---- c#:string //传入参数  
  79.  c++:char * ---- c#:StringBuilder//传出参数  
  80.  c++:char *变量名 ---- c#:ref string 变量名  
  81.  c++:char *输入变量名 ---- c#:string 输入变量名  
  82.  c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名  
  83.   
  84.   
  85.  c++:char ** ---- c#:string  
  86.  c++:char **变量名 ---- c#:ref string 变量名  
  87.  c++:const char * ---- c#:string  
  88.  c++:char[] ---- c#:string  
  89.  c++:char 变量名[数组大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;    
  90.   
  91.  c++:struct 结构体名 *变量名 ---- c#:ref 结构体名 变量名  
  92.  c++:委托 变量名 ---- c#:委托 变量名  
  93.   
  94.  c++:int ---- c#:int  
  95.  c++:int ---- c#:ref int  
  96.  c++:int & ---- c#:ref int  
  97.  c++:int * ---- c#:ref int //C#中调用前需定义int 变量名 = 0;  
  98.   
  99.  c++:*int ---- c#:IntPtr  
  100.  c++:int32 PIPTR * ---- c#:int32[]  
  101.  c++:float PIPTR * ---- c#:float[]  
  102.   
  103.  c++:double** 数组名 ---- c#:ref double 数组名  
  104.  c++:double*[] 数组名 ---- c#:ref double 数组名  
  105.  c++:long ---- c#:int  
  106.  c++:ulong ---- c#:int  
  107.      
  108.  c++:UINT8 * ---- c#:ref byte //C#中调用前需定义byte 变量名 = new byte();     
  109.   
  110.  c++:handle ---- c#:IntPtr  
  111.  c++:hwnd ---- c#:IntPtr    
  112.      
  113.  c++:void * ---- c#:IntPtr     
  114.  c++:void * user_obj_param ---- c#:IntPtr user_obj_param  
  115.  c++:void * 对象名称 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称  
  116.   
  117.      
  118.  c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte     
  119.  c++:short, short int, INT16, SHORT ---- c#:System.Int16     
  120.  c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32     
  121.  c++:__int64, INT64, LONGLONG ---- c#:System.Int64     
  122.  c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte     
  123.  c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16     
  124.  c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32     
  125.  c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64     
  126.  c++:float, FLOAT ---- c#:System.Single     
  127.  c++:double, long double, DOUBLE ---- c#:System.Double     
  128.   
  129.   
  130.  Win32 Types ---- CLR Type     
  131.      
  132.   
  133.   
  134.  Struct需要在C#里重新定义一个Struct  
  135.  CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);  
  136.   
  137.   
  138.  unsigned char** ppImage替换成IntPtr ppImage  
  139.  int& nWidth替换成ref int nWidth  
  140.  int*, int&, 则都可用 ref int 对应  
  141.  双针指类型参数,可以用 ref IntPtr  
  142.  函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);  
  143.  char* 的操作c++: char*; 对应 c#:StringBuilder;  
  144.  c#中使用指针:在需要使用指针的地方 加 unsafe  
该表来自于:http://blog.csdn.net/qq2399431200/article/details/9173117

0 0