今天小编用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里面的类型一样,应该是没问题的,如图所示:
于是小编欣喜若狂的开始使用这个hst_open方法了,小编是这样调用的,于是就出现了上述的错误,如图:
解决方案:
小编最后用C++语言同样的调用DLL动态链接库做了实验,发现虽然没有报这种错误,但是发现hst_open方法的这两个参数类型竟然是错误的!后来小编将它的两个参数类型做了一些改变,例如将hst_open方法第一个参数类型改成int类型,将第二个参数改成ref引用类型,如图所示:
小编改变DLL方法参数类型之后,在C#调用DLL动态链接库方法的时候,传值的时候自然也要做一些改变,引用类型的值要加入“ref”关键字,值类型(如com)则直接传入数字或变量名即可,如图所示:
如果在VB.NET语言中调用DLL动态链接库出现"Additional information: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"的错误,该如何解决呢?
其实万变不离其宗,出现这样的错误也是因为在调用dll的时候参数类型不对,一定要注意参数是ByVal(值类型)还是ByRef(引用类型),于是同样的错误,小编将参数改成如图所示就可以了,如下:
在结构体前面加入ByRef引用类型标志,第一个参数即使是值类型,也要看是Integer还是Long,因为类型的正确与否对于DLL的调用是非常重要的,然后在VB.NET中想要调用它,传值时可以直接传入值和结构体,如图:
中心思想:
调用dll动态链接库的时候,参数类型是非常重要的,如果类型不对,就会出现本文这样的错误。