私はこのコードを持っています(C#のNokia PC Connectivity 3.2サンプルコードから):
DAContentAccessDefinitions.CA_FOLDER_INFO folderInfo =
new DAContentAccessDefinitions.CA_FOLDER_INFO();
folderInfo.iSize = Marshal.SizeOf(folderInfo); //(32)
IntPtr bufItem = Marshal.AllocHGlobal(folderInfo.iSize);
//I often get a AccessViolationException on the following line
Marshal.StructureToPtr(folderInfo, bufItem, true);
これの最初に実行するGC.Collect()
と、は取得されませんAccessViolationException
。しかし、必要な場合を除いて、この機能を遅くしたくありません。いろいろなところに置いてみましたが、うまくいきませんGC.Keepalive
でした。
CA_FOLDER_INFO
と定義されている:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct CA_FOLDER_INFO
{
public int iSize;
public int iFolderId;
public int iOptions;
public string pstrName;
public string pstrPath;
public int iSubFolderCount;
public IntPtr pSubFolders;
public IntPtr pParent;
}
この場合、どちらの文字列も必要ありません。定義を変更するとIntPtr
、例外がなくなるようです。
ここで何が起こっているのか、そして例外を防ぐ正しい方法は何ですか?