- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的一个 C# 应用程序 (.NET 2) 中,我使用了一个调用一些 OpenProcess()
的非托管模式库 (C)。我最近添加了一些使用 Process.GetProcessById()
的 C# 代码。进行此更改后,即使应用于用于使它们失败的 PID,OpenProcess()
也开始成功。经过一些调查,我发现 Process.GetProcessById()
隐式设置了 SeDebugPrivilege
给应用程序(注意:当前用户拥有管理员权限)。由于在我的特定应用程序中这种行为是不可取的,因此我最终通过调用 Process.LeavDebugMode()
恢复了正常权限。
由于我找不到任何关于此的描述,我对我的程序的正确性有些担忧。调用 Process.LeavDebugMode()
来“调整”Process.GetProcessById()
的工作是否正确?简而言之,我的 Process.GetProcessById()
是否按预期工作(例如由 MSDN 记录),或者我观察到的行为是否在我的应用程序中隐藏了一些细微的错误?
我的操作系统是用于嵌入式系统的 Windows 7 SP1 64 位。
编辑:更多信息:该进程以 32 位模式运行(即它运行 32 位版本的 .NET 引擎)。另外,我添加了这个“.config”文件以确保使用的 .NET 版本是 2:
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
EDIT2:更多实验:编写了一个普通的 C#/WindowsForm 应用程序(感谢 MS 向导 ;-)),添加了两个按钮,一个用于调用 Process.GetProcessById()
,一个用于调用 Process.LeaveDebugMode()
。这是相关代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;
namespace testproc
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Process proc = Process.GetProcessById(Process.GetCurrentProcess().Id);
}
private void button2_Click(object sender, EventArgs e)
{
Process.LeaveDebugMode();
}
}
}
启动应用程序(在 VS 之外),然后启动进程资源管理器。它证实了奇怪的“特征”:
因此,我只能确认我的断言(至少对于 Process.GetProcessById()
的第一次调用)。有什么想法吗?
最佳答案
看起来像是 .NET 中的错误,但在有人可以重现它之前,它可能只是您机器上的一些奇怪之处。
不管怎样,调用 LeaveDebugMode() 来解决这个问题应该是无害的。它所做的只是禁用特权,将线程返回到正常状态。 (文档没有说明,但大概在调试权限已被禁用时调用 LeaveDebugMode() 什么都不做;这就是底层 API 的行为方式。)
关于c# - Process.GetProcessById 启用 "debug mode",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28453444/
我正在编写一个 c# 程序,它将启动许多子进程。稍后,我需要通过 ID 检索这些进程,然后将这些进程与存储在字典中的一组进程进行匹配,这些进程在首次创建时添加到字典中。但是,我遇到了一个看起来很荒谬的
在 .NET 中 Process.GetProcessById如果具有此 ID 的进程未运行,则抛出异常。如何安全地调用此方法,使其不会抛出异常?我在想类似的事情 if(Process.IsRunni
在我的一个 C# 应用程序 (.NET 2) 中,我使用了一个调用一些 OpenProcess() 的非托管模式库 (C)。我最近添加了一些使用 Process.GetProcessById() 的
我正在编写一段代码,用于循环访问系统进程 (PID:4) 加载的模块列表。以下是我用来实现它的代码。 Process process = Process.GetProcessById(4); fore
我在一个方法中有这段代码: int startApp() { ProcessStartInfo proc = new ProcessStartInfo(); proc.FileName = "
我是一名优秀的程序员,十分优秀!