2016-06-16 6 views
1

私はVS2015を使用しているC#で長いファイルパスのためにこのp/invokeメソッドを実行しようとしています。ただし、EFileAccess EFileShareのECreationDisposition EFileAttributesはネームスペースに存在しません。 FileAccess、FileShare、FileMode、FileAttributesに変更した場合、エラーは消えてしまいます。これらのタイプは文脈の中で交換可能ですか?私のプロジェクトで何が欠けていたのですか?C#P/Invoke missing type

using System; 
using System.IO; 
using System.Runtime.InteropServices; 
using Microsoft.Win32.SafeHandles; 

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
internal static extern SafeFileHandle CreateFile(
    string lpFileName, EFileAccess dwDesiredAccess, EFileShare dwShareMode, 
    IntPtr lpSecurityAttributes, ECreationDisposition dwCreationDisposition, 
    EFileAttributes dwFlagsAndAttributes, IntPtr hTemplateFile); 

public static void TestCreateAndWrite(string fileName) { 
    string formattedName = @"\\?\" + fileName; 
    // Create a file with generic write access 
    SafeFileHandle fileHandle = CreateFile(formattedName, 
     EFileAccess.GenericWrite, EFileShare.None, IntPtr.Zero, 
     ECreationDisposition.CreateAlways, 0, IntPtr.Zero); 

    // Check for errors 
    int lastWin32Error = Marshal.GetLastWin32Error(); 
    if (fileHandle.IsInvalid) { 
     throw new System.ComponentModel.Win32Exception(lastWin32Error); 
    } 

    // Pass the file handle to FileStream. FileStream will close the 
    // handle 
    using (FileStream fs = new FileStream(fileHandle, 
     FileAccess.Write)) { 
     fs.WriteByte(80); 
     fs.WriteByte(81); 
     fs.WriteByte(83); 
     fs.WriteByte(84); 
    } 
} 
+0

'名前空間には存在しません。あなたはそれらを定義する必要があります。私は一度同値をチェックしたことを覚えています。いくつかは同等だった、いくつかはなかった。 – usr

+0

しかし、彼らはkernell32.dllからインポートされるはずだった – Yangrui

答えて

2

enumをインポートすることはできません。ネイティブDLLは、それを定義する方法がありません。 ABI境界では、列挙型は単なる整数です。 enumは純粋に.NETのコンセプトです。

enumを自分で定義します。 (実際には、これはどこかからそれを盗むことを意味します)

+0

ありがとう!ちょうどどこかからenumを見つけました... – Yangrui