C#调用C的DLL文件总是:
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这个是DLL文件中的STRUCT
struct Reynold{
float Nr;
float rho;
float u;
float Dh;
float mu;
};
/* --- Export Function Declaration ----------- */
HPMAGI int Reynolds(int MG2Find, struct Reynold *ren, int *ErrMsgID);
下面是我写的调用方法
[DllImport(@"C:\Documents and Settings\Administrator\桌面\面试准备\Reynolds\Release\Reynolds.dll", CharSet = CharSet.Auto)]
public static extern int Reynolds(int MG2Find, ref ren re, int errMsg);
public Form1()
{
InitializeComponent();
}
public struct ren
{
public float dblrho;
public float dblu;
public float Dh;
public float mu;
public float Nr;
}
private void button2_Click(object sender, EventArgs e)
{
ren re = new ren();
re.dblrho = float.Parse(textBox1.Text);
re.dblu = float.Parse(textBox2.Text);
re.Dh = float.Parse(textBox3.Text);
re.Nr = float.Parse(textBox4.Text);
Reynolds(0, ref re ,1000 );
textBox5.Text = re.mu.ToString();
}
可是我总是一调用就报: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
------解决方案--------------------C#要用class代替struct
换成:
[StructLayout(LayoutKind.Sequential)]
public class ren
{
public float dblrho;
public float dblu;
public float Dh;
public float mu;
public float Nr;
}
还有 LZ的变量命名不太规范哦~
------解决方案--------------------Reynolds(0, ref re ,1000 ); 1000这里应该用变量。
用个变量替换1000 因为这里是一个int型的指针,不能直接给常量。