我有这段代码(来自诺基亚 PC 连接 3.2 示例代码,用 C# 编写):
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
似乎会使异常消失。
这里发生了什么,防止异常的正确方法是什么?