C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏,第1张

System.AccessViolationException尝试首李读取或写入受保护的内存。这通常指示其他内存已损坏。

几经周折,觅得答案,原来是要隐销指定

调用方式,如下就OK了:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

public

delegate

void

CallbackFunc1(IntPtr

hWnd,

IntPtr

pArg)

而系统默认方式为

CallingConvention.StdCall。

程序终于不报错了,但是又出现结果不对了

定义成如下时,strName在方法中的值,只有一个字符,

public

delegate

void

CallbackFunc1(StringBuilder

strName,

IntPtr

pArg)

后来改为:

public

delegate

void

CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)]

StringBuilder

strName,

IntPtr

pArg)

OK了,strName带出来的值完整了,参数类型定义成

string

或者

StringBuilder

都无所谓

可以用

IntPtr

,或者

char*

都行(用char*

得加

unsafe)

char*

类型的,得到值后,可循环至'\0'得到整个字符串

IntPtr

类型的,可以用Marshal.Copy出来,如:

Marshal.Copy(IntPtr_source,

toBytes,

0,

1024)

如果报

“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

异常,

还有可能是因为C++和C#的参数类型对应问题,

如:

bool

__declspec(dllimport)

getImage(unsigned

char**

ppImage,

int&

nWidth,

int&

nHeight)

对应成

[DllImport("test.dll")]

public

static

extern

bool

getImage(IntPtr

ppImage,

ref

int

nWidth,

ref

int

nHeight)时,

则该方法在调用前,要对传入的ppImage分配空间,如下

IntPtr

pImage

=

Marshal.AllocHGlobal(iWidth

*

iHeight)

这种方法不推荐,因为是带出结果来,一般这种指针不确定需要分配多大空间的。

正确的要对应成下面这样:

[DllImport("test.dll")]

public

static

extern

bool

getImage(ref

IntPtr

ppImage,

ref

int

nWidth,

ref

int

nHeight)

调用时只要定义就行了:

IntPtr

pImage

=

new

IntPtr()

int

refWidth

=

0,

refHeight

=

0

getImage(ref

pImage,

ref

refWidth,

ref

refHeight)

总结,凡是双针指类型参数者携迟,可以用

ref

IntPtr

而对于

int*,

int&,

则都可用

ref

int

对应

在两个activity直接传递List<xxInfo>时,出现Parcel: unable to marshal value异常。

在MainActivity页面(MainActivity页面向败册含NextActivity页面传递一个List<xxInfo>):

Intent intent = new Intent(this, NextActivity.class)

intent.putExtra("list", list)

startActivity(intent)

但需要注意:

xxInfo要implements Serializable或者继承Parcelable,我察笑的程序是implements Serializable。

list必须是ArrayList(若是List会提示错误)。

MainActivity中,intent.putExtra("list"姿芦, Arraylist实例)。

NextActivity中,List<xxInfo>infoList = (ArrayList) getIntent().getSerializableExtra("list")


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12510349.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存