【发布时间】: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,因为没有它,控制台就不会出现。