Я пытаюсь вернуть указатель из моей C++ dll в C#. Я пробовал все, но мой указатель типа double не имеет значения.Как вернуть двойной указатель из C++ dll в C#?
Ниже мой импорт DLL C++:
[DllImport("/Resources/libfli.dll", EntryPoint = "FLIGetTemperature")]
public static extern unsafe int FLIGetTemperature(long dev, double* temperature);
// Get the temperature of a given camera. This function places the temperature of the CCD camera
// cold finger of device dev in the location pointed to by temperature.
// Return Value: Zero on success. Non-zero on failure.
// Parameters: dev Camera device to get the temperature of.
// temperature Pointer to where the temperature will be placed.
// See Also: FLISetTemperature
Defination из FliGetTemperatre от FLI_SDK_Documentation
LIBFLIAPI FLIGetTemperature (flidev_t dev, double* temperature)
Get the temperature of a given camera.
Ниже, как я объявляю свой призыв к .dll в C#:
unsafe public void GetTheTemperatureOfTheCamera()
{
int success=0;
long ldev = 0;
long* dev = &ldev;
double lTemperature = 0;
double* temperature = &lTemperature;
success = FLIGetTemperature(ldev, temperature);
}
Когда я запускаю свой код, я получаю следующее сообщение об ошибке:
Необработанное исключение типа «System.AccessViolationException» произошло в MyApplication.exe
Дополнительная информация: Попытка чтения или записи в защищенной памяти. Это часто свидетельствует о том, что другая память повреждена.
Я также пробовал маршалинг и IntPtr
, но это тоже не работает.
Я пробовал Fliopen, что fucntion работает. Это успех. Ниже приведен код для FliOpen.
[DllImport("/Resources/libfli.dll", EntryPoint = "FLIOpen")]
public static extern unsafe int FLIOpen(long* dev, string name, long domain);
unsafe public int InitDevice()
{
long ldev = 0;
long* dev = &ldev;
int success;
string deviceName = "flipro0";// this is default name for device
long domainName = 258; //this is default domain name
success = FLIOpen(dev, deviceName, domainName);
return success;
}
Метод FLIOpen является успехом, хотя
Это не выглядит правильным.Пара вещей, которые нужно попробовать ... Во-первых, у вас есть typelib для DLL, и можете ли вы найти этот метод в oleview? Если это так, пожалуйста, отредактируйте, чтобы опубликовать сообщение о том, что говорит о методе. Во-вторых, я полагаю, вы пытались не использовать указатели на стороне C# и просто использовать 'FLIGetTemperature (long dev, ref double temperature)' как определение 'extern'? – Andrew
Код - это вздор, очень важно, чтобы вы сначала поняли api, прежде чем пытаться его вывести. Вы должны * заставить FLIOpen() работать сначала, чтобы у вас было правильное значение для первого аргумента. –
@ Функция HansPassant my Fliopen работает. У меня есть документация Api, и я редактировал сообщение о том, как они структурируют функцию GetTemperature(). – Neo