Dll使用数组将C++导入C#

jp2*_*ode 7 c# arrays dllimport

我已经获得了将一些库例程移植到C#的任务,因此我们的其他应用程序开发人员可以访问它,但我不知道如何声明变量以便它们正确地进入例程.

问题是,当我逐步阅读C++代码中的输入时,我得到了所有偏斜的值

尝试使用:

double[] Par = { 8, 16, 8, 0.61, 0.00635, ... }; // 29 variables
double[] Inlet = { 22.18, 43.31, 1.13, 2.81, 0.43 }; // 5 variables
double[] Outlet = { 0, 0, 0, 0, 0, 0 }; // placeholder for 6 variables
SteadyFor(ref Par, ref Inlet, ref Outlet, FileIn, FileOut);
Run Code Online (Sandbox Code Playgroud)

DLL导入

[DllImport(MODELAPP, EntryPoint = "SteadyFor", ExactSpelling = false)]
public static extern int SteadyFor(
  ref double[] par, ref double[] inlet, ref double[] outlet,
  [MarshalAs(UnmanagedType.LPStr)] string input,
  [MarshalAs(UnmanagedType.LPStr)] string output);
Run Code Online (Sandbox Code Playgroud)

C++文件:

extern "C" int SteadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut)
{
  int n = (int)Par[0]; // Actual Reading: [0]
  int nt = (int)Par[1]; // Actual Reading: [0]
  int pass = (int)Par[2]; // Actual Reading: [0]
  double l = Par[3]; // Actual Reading: [2.9581223236733198e+174]
  double rTube = Par[4]; // Actual Reading: [2.121995790965e-314#DEN]
  double tTube = Par[5]; // Actual Reading: [5.432309224896e-312#DEN]
  double pl = Par[6]; // Actual Reading: [1.0253217546256438e-267]
  double pt = Par[7]; // Actual Reading: [4.60629e-308]
  // ...
}
Run Code Online (Sandbox Code Playgroud)

显然,我得到的值都是错的 - 几乎就像非初始化的内存.

有人能告诉我我做错了什么以及如何解决它?

问候,

〜乔

Han*_*ant 8

删除声明中的"ref"关键字,它们不正确.C++代码没有与AV崩溃有点神秘.

字符串上的[MarshalAs]属性是不必要的.

  • 数组的默认封送处理是将指针传递给其第一个元素.就像C++一样.数组永远不会通过值传递,这将是非常昂贵的,注定要在大型数组上失败.当你使用"ref"时,它传递一个指向该指针的指针. (4认同)