У меня есть стандартный код C ANSI, который является авторитетным. Это означает, что, хотя у меня есть источник, я не могу перевести на другой язык и не изменять аргументы вызова, так как эти действия лишат права. Есть более 150 функций.Получение неуправляемых функций C++ из C#
Я могу совершить случайные изменения, например, изменить имена файлов с .C на .CPP, чтобы он скомпилировал с использованием компилятора Visual C++ Visual Studio 2009, который я сделал. Также могут быть добавлены директивы компилятора и т. Д. Я также могу пройти через оберточный слой, если это необходимо.
Другим ограничением является моя компания делает не хочет меня использовать небезопасный ключевое слово в любом C# код.
Мне нужно получить эти функции из программы C#.
Типичная С/С ++ функция выглядит следующим образом: double SomeFunction(double a, double[3] vec, double[3][3] mat);
Если содержимое массива иногда ввод, иногда выход, и редко, и другие.
Я сначала попытался сделать неуправляемую DLL (с функциями, отмеченными Extern C). Функции с только простыми аргументами (int, double) работали нормально, но я не мог определить, как маршалировать массивы. (На самом деле, я нашел некоторый пример кода, но было чрезвычайно сложно и неразумно дублировать 150 раз.)
Затем я попробовал два проекта в рамках одного и того же решения, один на C++, а другой на C#. В проекте C++ я создал управляемую функцию, которая только что называлась исходной функцией, которая была отмечена как неуправляемая. Это было очень чисто и просто, и снова простые аргументы отлично работали. Но для массивов я не мог найти способ сопоставления типов аргументов между границами C# и C++:
Argument '2': cannot convert from 'double[]' to 'double*'
(и, как упоминалось выше, я не могу использовать небезопасные для получения указателя).
Конечно, я должен сделать то, что я пытаюсь сделать.
Каков наилучший способ получить эти функции?
(Пример кода с использованием вышеуказанной функции будет действительно круто.)
Ах, спасибо! Ключом к этой проблеме было то, что в C++ массив объявляется как double [] [], но в C# как double [,]. Хотя первый является законным синтаксисом C#, он не представляет собой ту же внутреннюю организацию. Без этой ключевой части проницательности это не сработает. –