1

netapi32.dllDFS 共有を操作するために呼び出される Windows API .dll を使用しようとしています。Windows Server 2008 R2 で DFS を使用しており、.NET 4.0 を使用しています。.NET でこのようなものを使用したことはありませんが、何が失敗しているのか理解できません。

NetDfsGetInfoDllImportを呼び出して、DFS 共有に関する情報の取得をテストしています関数から受け取りたい情報レベルの構造を作成する必要がありました。

public struct DFS_INFO_3
{
    [MarshalAs(UnmanagedType.LPWStr)]
    public string EntryPath;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string Comment;
    public UInt32 State;
    public UInt32 NumberOfStorages;
    public IntPtr Storage;
}

public struct DFS_STORAGE_INFO
{
    public ulong State;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ServerName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ShareName;
}

次のコードを使用して、結果を取得して読み取りました。

[DllImport("netapi32", CallingConvention = CallingConvention.Winapi)]
public static extern int NetDfsGetInfo(
                    [MarshalAs(UnmanagedType.LPWStr)] string DfsEntryPath,
                    [MarshalAs(UnmanagedType.LPWStr)]string ServerName, 
                    [MarshalAs(UnmanagedType.LPWStr)]string ShareName, 
                    int Level, 
                    out IntPtr Buffer);

public void GetInfo() {
    IntPtr buffer;
    string dfsPath = "\\\\server\\share";

    int result = NetDfsGetInfo(EntryPath, null, null, 3, out buffer);

    if (result == 0) { //0 is Success
        DFS_INFO_3 info = (DFS_INFO_3)Marshal.PtrToStructure(buffer, typeof(DFS_INFO_3));
        DFS_STORAGE_INFO storage = (DFS_STORAGE_INFO)Marshal.PtrToStructure(info.Storage, typeof(DFS_STORAGE_INFO)); //Error
        Console.WriteLine("{0}, {1}, {2} ", storage.ServerName, storage.ShareName, storage.State);
    }
}

行を読み取るまで、すべてがうまくいきますstorage

次のようなエラーが表示されることがあります。

ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0x1d44 の 0x626ac91c でした。エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。

エラーの種類はfatalExecutionEngineErrorで、.NET Exception ではないため、キャッチできません。毎回発生するわけではありませんが、約 50% の確率でこのエラーが発生します。Windowsのエラー コードを調べると、5 が "アクセスが拒否されました" であることがわかります。IntPtr初心者レベルの Comp Sci に精通しているだけなので、ポインター (オブジェクトとは何か) について少し理解しています。なぜこのエラーがたまにしか発生しないのか、まだわかりません。

このエラーを理解/回避するにはどうすればよいですか?

4

1 に答える 1

2

の定義DFS_STORAGE_INFOが正しくありません。.NETではalong/ulongは64ビットですが、アンマネージWin32では32ビットのみです(int / uintと同じ)。

public struct DFS_STORAGE_INFO
{
    public UInt32 State;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ServerName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ShareName;
}

マーシャリングするDFS_STORAGE_INFOと、構造体の終わりを過ぎて4バイトを読み取ることになります。これは、構造体の後にあるものに応じて機能する場合と機能しない場合があります。

于 2012-07-09T16:07:22.297 に答える