最新消息:关注【已取消】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

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

C#/VB.NET 太平洋学习网 浏览 评论

今天小编用C#和VB.NET调用DLL动态链接库的时候,都出现了"Additional information: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"这样的错误,Visual Studio 2015的具体错误代码如下:

An unhandled exception of type 'System.AccessViolationException' occurred in WindowsFormsApplication1.exe

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

小编在C#中开始是这样的引入DLL的,参数分别是long类型与结构体类型,本身和DLL api里面的类型一样,应该是没问题的,如图所示:

20180726094603.jpg

于是小编欣喜若狂的开始使用这个hst_open方法了,小编是这样调用的,于是就出现了上述的错误,如图:

20180726094548.jpg

解决方案:

小编最后用C++语言同样的调用DLL动态链接库做了实验,发现虽然没有报这种错误,但是发现hst_open方法的这两个参数类型竟然是错误的!后来小编将它的两个参数类型做了一些改变,例如将hst_open方法第一个参数类型改成int类型,将第二个参数改成ref引用类型,如图所示:

20180726101713.jpg

小编改变DLL方法参数类型之后,在C#调用DLL动态链接库方法的时候,传值的时候自然也要做一些改变,引用类型的值要加入“ref”关键字,值类型(如com)则直接传入数字或变量名即可,如图所示:

20.jpg

如果在VB.NET语言中调用DLL动态链接库出现"Additional information: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"的错误,该如何解决呢?

其实万变不离其宗,出现这样的错误也是因为在调用dll的时候参数类型不对,一定要注意参数是ByVal(值类型)还是ByRef(引用类型),于是同样的错误,小编将参数改成如图所示就可以了,如下:

102456.jpg

在结构体前面加入ByRef引用类型标志,第一个参数即使是值类型,也要看是Integer还是Long,因为类型的正确与否对于DLL的调用是非常重要的,然后在VB.NET中想要调用它,传值时可以直接传入值和结构体,如图:

20180726102748.jpg

中心思想:

调用dll动态链接库的时候,参数类型是非常重要的,如果类型不对,就会出现本文这样的错误。

来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/csharp/704.html
"文章很值,打赏犒劳作者一下"
微信号: Javaweb_engineer

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

与本文相关的文章

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)

网友最新评论