Я уже некоторое время борюсь с Canon EDSDK. Я могу успешно заставить библиотеку сохранять файл непосредственно на диск, однако я не могу получить изображение byte[] в памяти. Всякий раз, когда я пытаюсь выполнить Marshal.Copy() поток EDSDK в byte[], я всегда получаю следующую ошибку:
AccessViolationException: Попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена.
Ниже приведен один из вариантов кода, который я использовал, чтобы попытаться получить поток:
private uint downloadImage(IntPtr directoryItem)
{
uint err = EDSDK.EDS_ERR_OK;
IntPtr stream = IntPtr.Zero;
// Get information of the directory item.
EDSDK.EdsDirectoryItemInfo dirItemInfo;
err = EDSDK.EdsGetDirectoryItemInfo(directoryItem, out dirItemInfo);
// Create a file stream for receiving image.
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsCreateMemoryStream(dirItemInfo.Size, out stream);
}
// Fill the stream with the resulting image
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsDownload(directoryItem, dirItemInfo.Size, stream);
}
// Copy the stream to a byte[] and
if (err == EDSDK.EDS_ERR_OK)
{
byte[] buffer = new byte[dirItemInfo.Size];
GCHandle gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
// The following line is where it blows up...
Marshal.Copy(stream, buffer, 0, (int)dirItemInfo.Size);
// ... Image manipulation, show user, whatever
}
return err;
}
Точки останова показывают (через объект EdsDirectoryItemInfo), что изображение действительно существует, я просто не знаю, почему я получаю исключение, которое я получаю. Я обдумывал идею смириться с поражением и просто считывал результирующий образ с диска, который он так охотно записывает с помощью метода CreateFileStream, но на самом деле я должен просто уметь манипулировать изображением в памяти.
Любые идеи?
ОБНОВЛЕНИЕ: я вижу такое поведение в обеих версиях 2.5 и 2.6.