У меня есть этот фрагмент кода (из примера кода подключения к ПК Nokia 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
, похоже, исключает исключение.
Что здесь происходит, и как правильно предотвратить исключение?