netapi32.dll
DFS 共有を操作するために呼び出される 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 に精通しているだけなので、ポインター (オブジェクトとは何か) について少し理解しています。なぜこのエラーがたまにしか発生しないのか、まだわかりません。
このエラーを理解/回避するにはどうすればよいですか?