C#调用非托管DLL时出现“尝试读取或写入受保护的内存”

近期因为业务需要,找人用易语言定做了一个DLL,里面含用一个输出函数,
我在C#里面用如下方式声明再调用:

[DllImport( " etest.dll " )]
public   static   extern  string TestFunc1(string param1);

string  ret1  =  TestFunc1("testparam1");

有时能调用成功,但大多时候会出现:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
换用StringBuilder类型作为参数和返回类型,也会出现同样的错误,偶尔还会出现“没有足够的内存继续执行程序。”,或者弹出对话框提示“不能分配112字节的椎栈空间”。。。反正全是内存操作方面的错误,我断断续续地调试了两天左右,试了各种类型,连byte[] 也用过,还是出错,
不过以前CSDN上有人评价过我是“偏执狂”,的确没错,我在技术问题上从不轻易妥协,结果终于问题有了一点头绪!
用GOOGLE在CSDN上搜到了这个贴子:http://topic.csdn.net/u/20071223/11/64dd0f4c-aff3-4e07-b662-722ffd2fead4.html,看到一楼有个建议好像不错,于是试了下,果然可以!
代码如下:

[DllImport( " etest.dll " )]
public   static   extern  IntPtr TestFunc1(IntPtr param1);
IntPtr ptrIn  =  Marshal.StringToHGlobalAnsi( " testparam1 " );
IntPtr ptrRet  =  TestFunc1(ptrIn);
string  ret2  =  Marshal.PtrToStringAnsi(ptrRet);
具体原理我一时也解释不清楚,似乎是要传指针才可以。我后来试着用Delphi封装了一下这个DLL,参数和返回类型全部用PCHAR,然后在.NET里面调用,仍然报同样的错误,不知道是不是易语言里面的string类型很特殊。。。大家可以发表下看法!

你可能感兴趣的:(C#调用非托管DLL时出现“尝试读取或写入受保护的内存”)