Получение на неуправляемых функциях C- от C #

У меня есть некоторые ANSI стандартный C код, который является авторитетным. Это означает, что, хотя у меня есть источник, я не могу перевести на другой язык, ни изменить призыв аргументы, так как эти действия будут недействительными власти. Существует более 150 функций.

Я могу внести случайные изменения, такие как изменение имен файлов из . C для . CPP так, что он компилирует с помощью Визуальной студии 2009 в C' компилятор, который я и сделал. Директивы компилятора и такие также могут быть добавлены. Я также могу пройти через слой обертки, если это необходимо.

Еще одно ограничение моя компания делает не хочу, чтобы я использовал небезопасных ключевое слово в любом коде C.

Мне нужно получить на эти функции из программы C.

Типичная функция C/C выглядит следующим образом:
double SomeFunction(double a, double[3] vec, double[3][3] mat);
Где содержимое массива иногда вводится, иногда выводится, и редко и то, и другое.

Я впервые попытался сделать неуправляемый DLL (с функциями, отмеченными Extern C). Функции только с простыми аргументами (int, двойной) работали хорошо, но я не мог определить, как маршал массивов. (На самом деле, я нашел некоторые образцы кода, но это было чрезвычайно сложным и необоснованным, чтобы дублировать 150 раз.)

Затем я попытался два проекта в рамках одного и того же решения, один в C , а другой в C . В проекте C, я создал управляемую функцию, которая только что назвала исходную функцию, которая была помечена как неуправляемая. Это было очень чисто и просто, и снова, простые аргументы работали хорошо. Но для массивов, я не мог найти, как сделать аргумент типов совпадают через C ' границы:
Argument '2': cannot convert from 'double[]' to 'double*'
(и, как упоминалось выше, я не могу использовать небезопасные, чтобы получить указатель).

Конечно, то, что я пытаюсь сделать, должно быть возможным.
Как лучше всего получить эти функции?
(Образец кода с использованием выше функции было бы очень здорово.)

Ответ на: "Получение на неуправляемых функциях C- от C #"

Количество ответов:3

Если вы не можете получить extern и P / Invoke решение для работы, обертка, вероятно, ваш лучший выбор. Создайте управляемый C'DLL, который использует как управляемый, так и неуправляемый код. Добавьте класс .NET в этот DLL, который является просто тонкой оберткой над функциями в вашем C DLL. Ваш код C'может вызывать класс C.NET, который, в свою очередь, будет продвигаться вперед по функциям C.

Таким образом, вы можете написать перевод между .NET и неуправляемым кодом самостоятельно, вместо того, чтобы полагаться на время выполнения, чтобы сделать это за вас.

Реализация образца C/C-46-"-

extern "C" __declspec(dllexport)
double SomeFunction(double a, double vec[3], double mat[3][3]) {
  double sum = a;
  for (int ix = 0; ix < 3; ++ix) {
    sum += vec[ix];
    for (int iy = 0; iy < 3; ++iy) {
      sum += mat[ix][iy];
    }
  }
  return sum;
}

Образец C-использование:

private void Form1_Load(object sender, EventArgs e) {
  double[] vec = new double[3];
  double[,] mat = new double[3, 3];
  for (int ix = 0; ix < 3; ++ix) {
    vec[ix] = ix;
    for (int iy = 0; iy < 3; ++iy) {
      mat[ix, iy] = (ix + 1) * iy;
    }
  }
  double sum = SomeFunction(1, vec, mat);
}
[System.Runtime.InteropServices.DllImport("cpptemp8.dll")]
private static extern double SomeFunction(double a, double[] vec, double[,] mat);

использовать глоток, он будет генерировать ваш пинвоек для вас