日期:2014-05-18  浏览次数:21163 次

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型的指针,不能直接给常量。