【问题标题】:Attach console to process将控制台附加到进程
【发布时间】:2021-08-08 12:36:11
【问题描述】:

我想将控制台连接到单人游戏应用程序。我一开始使用 .Net Framework,一切正常,然后我切换到 .Net Core 3.1,控制台停止附加到进程。

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool AttachConsole(int dwProcessId);

[DllImportAttribute("kernel32.dll", SetLastError = true, EntryPoint = "AllocConsole")]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
private static extern bool AllocConsole();

[DllImportAttribute("kernel32.dll", SetLastError = true, EntryPoint = "GetStdHandle")]
private static extern IntPtr GetStdHandle(Int32 nStdHandle);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool FreeConsole();

[DllImport("kernel32.dll", EntryPoint = "GetLastError")]
private static extern int GetLastError();

private void InitializeConsole() {
    if (AttachConsole(Process.GetCurrentProcess().Id) && AllocConsole()) {
        GetStdHandle(Process.GetCurrentProcess().Id);
        _isInitializeConsole = true;
    } else {
        _isInitializeConsole = false;
        throw new Exception($"Console alloc error code: {GetLastError()}");
    }
}

当尝试从 AttachConsole 方法附加控制台时,我得到结果“false”和最后一个错误代码 - 5(访问被拒绝)。我以管理员身份运行应用程序并收到错误代码 - 6(句柄无效)。

有没有办法修复这个错误?

【问题讨论】:

  • 您需要检查每个 P/Invoke 调用的返回值,而不仅仅是&& 的组合结果,因为GetLastError 可能会报告任何一个 AttachConsole AllocConsole 失败,你不知道是哪个。
  • 你为什么打电话给AttachConsole?那是用于跨进程控制台共享,但据我所知,您是在一个进程中完成这一切?
  • 你错误地调用了GetStdHandle:需要一个句柄号,不是一个进程ID:docs.microsoft.com/en-us/windows/console/getstdhandle
  • 如果你使用.net,为什么不直接使用C#提供的控制台功能docs.microsoft.com/en-us/dotnet/api/system.console?view=net-5.0
  • @Dai 确实,当我删除 AttachConsole 时,一切正常。出于某种原因,在 Net Framework 上,我需要执行 AttachConsole,因为没有它,控制台就不会出现。

标签: c# .net-core monogame


【解决方案1】:

.Net 与 .dot net core 完全不同。 DLLimport在framework下是可以接受的,但是在core下不行。 Core 是跨平台的,使得大多数原生调用无效。

要回答您的问题,请坚持使用框架的 4.6 - 4.8。这会将目标限制为 Windows 计算机,但它解决了当前的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多