c# 调用dll的问题

来源:百度知道 编辑:UC知道 时间:2024/06/02 10:12:34
我要调用一个dll文件,函数说明如下:
BOOL GetErrorStatus(int * error_code, char * error_string)
我的函数如下:
[DllImport("mbt2005.dll")]
public static extern bool GetErrorStatus(ref int error_code, ref StringBuilder error_string);

private void button1_Click(object sender, EventArgs e)
{
int error_code = -1;
StringBuilder error_string = new StringBuilder(256);
bool flag = GetErrorStatus(ref error_code, ref error_string);
}
但运行到bool flag = GetErrorStatus(ref error_code, ref error_string);时就会报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”,哪位大侠知道该怎么解决啊,谢谢了。
急 在线等啊
1楼的我试过了,编译时报错:错误 1 不安全代码只会在使用 /unsafe 编译的情况下出现
2楼的方法我也试过了,还是“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
3楼的方法,我在Delphi 中调用相同的dll文件,运行正常,Vs2005中就不行

哪位大侠知道该怎么解决啊,谢谢了。
分不够可以加,急,在线等

DllImport("mbt2005.dll")]
public static extern bool GetErrorStatus(ref int error_code, StringBuilder error_string);

private void button1_Click(object sender, EventArgs e)
{
int error_code = -1;
StringBuilder error_string = new StringBuilder(255);
bool flag = GetErrorStatus(ref error_code, error_string);
}

声明的时候加个unsafe

[DllImport("mbt2005.dll")]
unsafe public static extern bool GetErrorStatus(ref int error_code, ref StringBuilder error_string);

传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
你的error_string没有初始化呀,这样写试下看:
string temp = "";
StringBuilder error_string = new StringBuilder(temp,256);

我以前遇到过这种情况,原因是DLL本身有错误。当调用DLL导出函数的时候,只要DLL发生了运行时错误,不管错误是什么(比如数组越界等),报出的错误都是这样““尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
解决办法就是调试你的DLL。