が、私は(C#で、NokiaのPCの接続3.2サンプルコードからの)コードのこの部分を持っている理由私は理解していない実行:「GC.Collectは」私のクラッシュが修正されていますが、
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
を入れてみましたが、成功しませんでした。私は、この例では、文字列のいずれかを必要としない
[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
にその定義を変更すると、例外が離れて行くように思わ:
CA_FOLDER_INFO
は、以下のように定義されます。
ここでは何が起こっているのですか?例外を防ぐ正しい方法は何ですか?
あなたがbufItemで終わったら、try-finallyでMarshal.FreeHGlobalを呼び出すのを忘れないでください。 – sisve