4

如何在应用程序退出时指定返回错误代码?如果这是一个 VC++ 应用程序,我可以使用SetLastError(ERROR_ACCESS_DENIED)-- return GetLastError()API。有没有办法在 C# 中做到这一点?

  static int Main(string[] args)
  {
     Tool.Args = args;

     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new Download_Tool());

     return Tool.ErrorCode;
  }

值如何Tool.ErrorCode设置得通俗易懂?如果我尝试类似的东西Tool.ErrorCode = ERROR_ACCESS_DENIED,我会收到一个错误,“名称 ERROR_ACCESS_DENIED 在当前上下文中不存在。” 谢谢。

附加信息

我的例子过于简单了。有没有办法像这样:

Tool.ErrorCode = ERROR_ACCESS_DENIED;
return Tool.ErrorCode;

...这会产生编译错误,而不是这样:

Tool.ErrorCode = 5;
return Tool.ErrorCode;

...这有效,但使用了“幻数”。我想避免使用幻数。

4

2 回答 2

9

http://msdn.microsoft.com/en-us/library/system.environment.exit.aspx

Environment.Exit(exitCode)

更新

您收到“ERROR_ACCESS_DENIED”编译错误的原因是您没有定义它。您需要自己定义它:

const int ERROR_ACCESS_DENIED = 5;

然后你可以使用:

Environment.Exit(ERROR_ACCESS_DENIED)

更新 2

如果您正在为您的 C# 需求寻找一套现成的 winerror.h 常量,那么这里是:

http://www.pinvoke.net/default.aspx/Constants/WINERROR.html

我可能会修改 GetErrorName(...) 方法来做一些缓存,例如:

private static Dictionary<int, string> _FieldLookup;

public static bool TryGetErrorName(int result, out string errorName)
{
    if (_FieldLookup == null)
    {
        Dictionary<int, string> tmpLookup = new Dictionary<int, string>();

        FieldInfo[] fields = typeof(ResultWin32).GetFields();

        foreach (FieldInfo field in fields)
        {
            int errorCode = (int)field.GetValue(null);

            tmpLookup.Add(errorCode, field.Name);
        }

        _FieldLookup = tmpLookup;
    }

    return _FieldLookup.TryGetValue(result, out errorName);
}
于 2010-07-08T15:03:21.107 回答
-1

设置Environment.ExitCode

static void Main(string[] args)
  {
     Tool.Args = args;

     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new Download_Tool());

     Environment.ExitCode = Tool.ErrorCode;
  }

请参阅MSDN - Environment.ExitCode 属性

于 2010-07-08T15:07:51.283 回答