私はキヤノンEDSDKとしばらく戦っています。ライブラリにファイルを直接ディスクに保存させることはできますが、イメージbyte[]をメモリに保持することはできません。EDSDKストリームをbyte[]にMarshal.Copy()しようとすると、常に次のエラーが発生します。
AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。
以下は、ストリームを取得するために使用したコードのバリエーションの1つです。
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の両方でこの動作が見られます。