У меня есть ниже реализация в C ++ (создали DLL той же)
double *getData()
{
double *eyeTrackData = new double[10];
const unique_ptr<Fove::IFVRHeadset> headset{ Fove::GetFVRHeadset() };
CheckError(headset->Initialise(Fove::EFVR_ClientCapabilities::Gaze),
"Initialise");
Fove::SFVR_GazeVector leftGaze, rightGaze;
const Fove::EFVR_ErrorCode error = headset->GetGazeVectors(&leftGaze,
&rightGaze);// Check for error
switch (error)
{
case Fove::EFVR_ErrorCode::None:
eyeTrackData[0] = (double)leftGaze.vector.x;
eyeTrackData[1] = (double)leftGaze.vector.y;
eyeTrackData[2] = (double)rightGaze.vector.x;
eyeTrackData[3] = (double)rightGaze.vector.y;
break;default:
// Less common errors are simply logged with their numeric value
cerr << "Error #" << EnumToUnderlyingValue(error) << endl;
break;
}
return eyeTrackData;
}
Я включил
extern "C"{
__declspec(dllexport) double *getData();
}
в заголовочном файле.
Я пытаюсь получить это до-диез.
[DllImport("C:\\Users\\BME 320 - Section 1\\Documents\\Visual Studio 2015\\Projects\\EyeTrackDll\\x64\\Debug\\EyeTrackDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr eyeData();
Но я не знаю, как получить массив внутри события buttonClick.
Я ценю любую помощь в этом.
Следуя советам @DavidHeffernan, я постараюсь дать вам пример того, как достичь вашей цели. Пожалуйста, примите часть C # как псевдокод, так как я не эксперт в этом языке.
Я бы использовал структуру, как было сказано ранее, просто для ясности, и я считаю хорошей практикой дать некоторую защиту типов и возможность добавить атрибут «размер» в структуру, если не знаю точно, сколько удваивается. быть. В вашем случае, как всегда 4, не нужно.
Функция в библиотеке C ++:
void getData(double* eyeTrackData)
{
const unique_ptr<Fove::IFVRHeadset> headset{ Fove::GetFVRHeadset() };
CheckError(headset->Initialise(Fove::EFVR_ClientCapabilities::Gaze), "Initialise");
Fove::SFVR_GazeVector leftGaze, rightGaze;
const Fove::EFVR_ErrorCode error = headset->GetGazeVectors(&leftGaze, &rightGaze);// Check for error
switch (error)
{
case Fove::EFVR_ErrorCode::None:
eyeTrackData[0] = (double)leftGaze.vector.x;
eyeTrackData[1] = (double)leftGaze.vector.y;
eyeTrackData[2] = (double)rightGaze.vector.x;
eyeTrackData[3] = (double)rightGaze.vector.y;
break;
default:
// Less common errors are simply logged with their numeric value
cerr << "Error #" << EnumToUnderlyingValue(error) << endl;
break;
}
}
Сторона C #:
[DllImport("C:\\Users\\BME 320 - Section 1\\Documents\\Visual Studio 2015\\Projects\\EyeTrackDll\\x64\\Debug\\EyeTrackDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void eyeData(IntPtr);
private void button1_Click(object sender, EventArgs e)
{
try
{
IntPtr ipr = Marshal.AllocHGlobal(4); // Memory blob to pass to the DLL
eyeData(ipr);
double[] eyeTrackData = new double[4]; // Your C# data
Marshal.Copy(ipr, eyeTrackData, 0, 4); // Convert?
}
finally
{
Marshal.FreeHGlobal(ipr);
}
}
Опять извините за мой «плохой C #» xD. Надеюсь это поможет.
Других решений пока нет …