C#P /调用缺失类型

时间:2016-06-16 22:45:26

标签: c# visual-studio

我正在尝试使用VS2015在c#中为长文件路径运行此p / invoke方法。但是,名称空间中不存在EFileAccess EFileShare ECreationDisposition EFileAttributes。如果我将它们更改为FileAccess,FileShare,FileMode和FileAttributes,则错误消失了。这些类型在上下文中是否可以互换?我在项目中缺少什么?

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);
    }
}

1 个答案:

答案 0 :(得分:2)

您无法导入枚举。本机DLL无法定义它。在ABI边界处,枚举只是一个整数。枚举纯粹是一个.NET概念。

自己定义枚举。 (在实践中,这意味着从某个地方窃取它。)