我们的一个C#项目需要调用C++的dll,通过Pinvoke进行方法调用。其中的一个方法及其参数的定义是这样的:
[
StructLayoutAttribute
(
LayoutKind
.Sequential)]
public
struct
xvid_gbl_info_t
{
///
int
public
int
version;
///
int
public
int
actual_version;
///
char*
[
MarshalAsAttribute
(
UnmanagedType
.LPStr)]
public
string
build;
///
unsigned int
public
uint
cpu_flags;
///
int
public
int
num_threads;
}
[
DllImportAttribute(
"
xvidcore
"
, EntryPoint
=
"
xvid_global
"
)]
public
static
extern
int
xvid_global(
IntPtr
handle,
int
opt,
ref
xvid_gbl_info_t
param1,
IntPtr
param2);
在做demo时,一切正常,而且在测试的7台电脑上均能正常运行。
但到正式项目中,完全一样的调用模式,却有3台电脑正常运行,4台电脑执行到该方法时就报错:“有未处理的异常,堆已损坏。”
昨天晚上搞到半夜,仍然是如此,奇怪!希望有大侠能指教一二,感激不尽。
注:问题已经解决,原因是不能调用静态方法和成员,如果先调用了静态方法和成员,再调用Pinvoke上面的方法,在某些机器上就会抛出异常。但是为何会这样奇怪了?不得其解。