Импорт Dll C++ к C# с массивами

Мне дали присвоение для портирования некоторых библиотечных подпрограмм на 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);

Импорт 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);

Файл 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]
  // ...
}

Очевидно, значения, которые я получаю, неправильны - почти как неинициализированная память.

Кто-то мог сказать мне, что я делаю неправильно и как зафиксировать его?

С уважением,

~Joe

7
задан jp2code 29 November 2016 в 11:30
поделиться

2 ответа

Уберите ключевые слова "ref" в объявлении, они не корректны. То, что код на C++ не падает с AV, немного загадочно.

Атрибут [MarshalAs] для строк не нужен.

8
ответ дан 7 December 2019 в 03:11
поделиться

Обычно вам нужно объявить атрибут маршалинга. В вашем случае это будет атрибут MarshalAs (UnmanagedType.LPArray) .

Посмотрите здесь:
http://msdn.microsoft.com/en-us/library/z6cfh6e6%28VS.80%29.aspx#cpcondefaultmarshalingforarraysanchor3

1
ответ дан 7 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: