Я пытаюсь понять эту магию «ЭТО РАБОТАЕТ» для взаимодействия C#/C++, но в настоящее время это ТОЛЬКО НОЧНАЯ.Как получить управляемую структуру в C++/native
Я играю с вычислениями Мандельброта и хочу разгрузить вычислительное ядро на родные C++ и SSE2. Это работает с P/Invoke. Теперь я хочу перейти на IJW, быть более типичным и потому, что хочу это понять. Но это были десятилетия назад, когда я поцарапал поверхность C++.
У меня есть struct Complex { double real; double imag; }
провести начальные значения для контура Мандельброта, и я хотел бы вызвать функцию так:
Compute(int vectorSize, Complex[] points, double maxValue, int maxLoops, int[] result)
Теперь я создал библиотеку CLR класса с VS Express, 2013 и поместить это в файл заголовка:
public value struct Complex
{
double real;
double imag;
};
public ref class Computations
{
public:
static void Basic(int vectorSize, array<Complex,1>^ points, double maxRadius, int maxLoops, array<int,1>^ result);
};
class NativeComputations
{
public:
static void Basic(int vectorSize, Complex* points, double maxRadius, int maxLoops, int* result);
};
и в CPP файле это:
#pragma managed
void Mandelbrot::Computations::Basic(int vectorSize, array<Complex,1>^ points, double maxRadius, int maxLoops, array<int,1>^ result)
{
pin_ptr<Complex> pPoints = &points[0];
pin_ptr<int> pResult = &result[0];
NativeComputations::Basic(vectorSize, pPoints, maxRadius, maxLoops, pResult);
}
#pragma unmanaged
void Mandelbrot::NativeComputations::Basic(int vectorSize, Complex* points, double maxRadius, int maxLoops, int* result)
{
double foo = points[0].real;
}
На данный момент я застреваю - ошибка C3821: «точки»: управляемый тип или функция не могут использоваться в неуправляемой функции
Поэтому мне нужно использовать что-то неуправляемое. Я могу повторить свой код и объявить структуру ComplexNative (опустив ключевое слово «значение»). Это возможно, но повторите код? И даже если это так, что необходимо для перевода комплекса [] на закрепленный ComplexNative *?
И, пожалуйста, я не хочу разделить структуру на двойной [] реальный, двойной [] образ. Это может привести к более простому обходному пути, но я хотел бы знать, как это сделать правильно.
Большое спасибо, Ханс. Я многое узнал из вашего ответа. Но нижняя линия для меня такова: IJW, как P/Invoke, заставляет меня дублировать объявления объектов данных, которые должны быть разделены между native и managed. Мне все еще нужно знать детали структуры структуры на C++ для этого. Если эти заявления становятся сложными или более обширными, необходимо проявлять большую осторожность. Конечно, я признаю, что вам нужно быть осторожным и знать о деталях компоновки структуры, когда вы говорите на C++ :) – Rolf