C# 通过IntPtr循环生成结构数组时出错

C# 通过IntPtr循环生成结构数组时出错,c#,marshalling,intptr,C#,Marshalling,Intptr,从另一个struct中的IntPtr构建struct数组时遇到问题 此结构由我正在使用的 public struct DFS_INFO_9 { [MarshalAs(UnmanagedType.LPWStr)] public string EntryPath; [MarshalAs(UnmanagedType.LPWStr)] public string Comment; public DFS_VOLUME_STATE State; public

从另一个
struct
中的
IntPtr
构建
struct
数组时遇到问题

此结构由我正在使用的

public struct DFS_INFO_9 {
    [MarshalAs(UnmanagedType.LPWStr)]
    public string EntryPath;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string Comment;
    public DFS_VOLUME_STATE State;
    public UInt32 Timeout;
    public Guid Guid;
    public UInt32 PropertyFlags;
    public UInt32 MetadataSize;
    public UInt32 SdLengthReserved;
    public IntPtr pSecurityDescriptor;
    public UInt32 NumberOfStorages;
    public IntPtr Storage;
}

[DllImport("netapi32", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int NetDfsEnum([MarshalAs(UnmanagedType.LPWStr)]string DfsName, int Level, int PrefMaxLen, out IntPtr Buffer, [MarshalAs(UnmanagedType.I4)]out int EntriesRead, [MarshalAs(UnmanagedType.I4)]ref int ResumeHandle);
我正在尝试获取
IntPtr STORAGE
引用的
DFS\u STORAGE\u INFO\u 1
s数组

以下是该结构(如果重要的话):

到目前为止,这段代码一直在使用一个存储器获取
DFS\u INFO\u 9
s,但在尝试封送数组中的第二项时失败

DFS_INFO_9 info = GetInfoFromWinApi();
List<DFS_STORAGE_INFO_1> Storages = new List<DFS_STORAGE_INFO_1>();
for (int i = 0; i < info.NumberOfStorages; i++) {
    IntPtr pStorage = new IntPtr(info.Storage.ToInt64() + i * Marshal.SizeOf(typeof(DFS_STORAGE_INFO_1)));
    DFS_STORAGE_INFO_1 storage = (DFS_STORAGE_INFO_1)Marshal.PtrToStructure(pStorage, typeof(DFS_STORAGE_INFO_1));
    Storages.Add(storage);
}
DFS_INFO_9 INFO=GetInfoFromWinApi();
列表存储=新列表();
对于(int i=0;i

我得到了一个
FatalExecutionEngineError
,它抛出了错误代码0x0000005(访问被拒绝)。我假设DFS\u STORAGE\u INFO\u 1的大小计算错误,导致封送处理尝试访问分配给阵列的内存之外的内存。但这种情况发生在
i=1
上,当时可能有7个存储区需要通过。也许我的想法有缺陷,但我不知道如何纠正这一点。

DFS\u STORAGE\u INFO\u 1
的实际定义是:

public struct DFS_STORAGE_INFO_1 {
    public DFS_STORAGE_STATE State;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ServerName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ShareName;
    DFS_TARGET_PRIORITY TargetPriority;
}
TargetPriority是一种结构,定义如下:


至于
fatalexecutionengineer错误
,我认为结构
DFS\u STORAGE\u INFO\u 1
的大小计算错误,因为它的定义不正确。当试图将指针转换为它们引用的结构时,下一个索引错误,因为大小已关闭。转换内存块时,它可能引用了一个不应该访问的块,抛出“拒绝访问(0x0000005)”错误。

DFS\U存储信息1的实际定义如下:

public struct DFS_STORAGE_INFO_1 {
    public DFS_STORAGE_STATE State;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ServerName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ShareName;
    DFS_TARGET_PRIORITY TargetPriority;
}
TargetPriority是一种结构,定义如下:


至于
fatalexecutionengineer错误
,我认为结构
DFS\u STORAGE\u INFO\u 1
的大小计算错误,因为它的定义不正确。当试图将指针转换为它们引用的结构时,下一个索引错误,因为大小已关闭。当转换内存块时,它可能引用了一个不应该被访问的块,抛出了“拒绝访问(0x0000005)”错误。

看看这里一些珍贵的
,所以
帖子也会在这个
错误代码0xc0000005(拒绝访问)
上进行谷歌搜索。我看到过类似的东西,你可以打赌我在谷歌上搜索过。第一篇so帖子建议了我试图摆脱的解决方案,运行一个可执行文件。我正在尝试使用Windows API更好地管理代码,而不必打开命令提示符,希望一切正常。第二篇文章对我来说毫无意义。我想我知道你想要的是什么。我已经看过之前的一篇文章了。让我再找一次,看看它是否与targetpriority有关。这是一个结构,不是指针。哇,真不敢相信我忽略了这一点。谢谢@HansPassant。你能把这个列为答案吗?下面是结构定义的链接,证实了这一点:看看这里一些珍贵的
,所以
帖子也可以在谷歌上搜索
错误代码0xc0000005(拒绝访问)
我看到过类似的东西,你可以打赌我在谷歌上搜索过。第一篇so帖子建议了我试图摆脱的解决方案,运行一个可执行文件。我正在尝试使用Windows API更好地管理代码,而不必打开命令提示符,希望一切正常。第二篇文章对我来说毫无意义。我想我知道你想要的是什么。我已经看过之前的一篇文章了。让我再找一次,看看它是否与targetpriority有关。这是一个结构,不是指针。哇,真不敢相信我忽略了这一点。谢谢@HansPassant。你能把这个列为答案吗?以下是结构定义的链接,证实了这一点:
public struct DFS_TARGET_PRIORITY {
    public DFS_TARGET_PRIORITY_CLASS TargetPriorityClass;
    public UInt16 TargetPriorityRank;
    public UInt16 Reserved;
}

public enum DFS_TARGET_PRIORITY_CLASS {
    DfsInvalidPriorityClass = -1,
    DfsSiteCostNormalPriorityClass = 0,
    DfsGlobalHighPriorityClass = 1,
    DfsSiteCostHighPriorityClass = 2,
    DfsSiteCostLowPriorityClass = 3,
    DfsGlobalLowPriorityClass = 4
}