访问.net应用程序创建的对象

时间:2014-07-09 11:12:32

标签: c# winforms

在运行时可以访问&修改.net应用程序创建的对象?

当我们创建引用或值类型时,对象/ prop值存储在特定的内存位置,
我想知道我们是否可以访问该内存位置并设置自定义值。

这听起来像是黑客攻击(间谍程序),但我只是好奇是否可能

更新 请考虑以下计划:

void Main()
{
    string s = "Test";
    Console.ReadLine();
    Console.WriteLine(s);
}

此控制台应用程序生成一个exe,
当我运行exe时,它等待用户输入,
在等待输入时,我想从其他应用程序

更改变量s的值

3 个答案:

答案 0 :(得分:1)

这取决于“访问和修改对象”的含义。

如果您正在谈论对象属性值 - 当然是。即使对于私人会员,也可以使用所谓的Reflection。例如:

PropertyInfo propertyInfo = obj.GetType().GetProperty("SomeProperty");
propertyInfo.SetValue(obj, "SomeValue", null);

如果您正在谈论更改存储在内存位置的对象结构,例如更改其方法,添加/删除字段等 - 这是不可能的。

答案 1 :(得分:1)

是的,你可以使用Reflection,这是非常强大的,它仍然让我惊讶,你可以用它做什么。可能最适合你做一些研究,看看这是否正是你想要的。

以下是Microsoft概述here,它解释得相当不错。 This将我以前学到很多关于反思的知识链接起来,我总是把它推荐给别人。尝试一下,然后搜索更具体的问题,这里有很多关于stackoverflow的好问题和答案。

如果这不是您想要的,那么您可以通过内存编辑器修改任何内容,但这远远超出我的知识领域,您真的需要知道您希望如何/为什么要做这些事情。

答案 2 :(得分:0)

听起来你想要附加到正在运行的程序并检查其状态。这通常是调试器的工作,例如Visual Studio。

在“调试”菜单中,您将找到一个选项"附加到流程"列出所有正在运行的进程。选择要查看的程序进程后,Visual Studio将尽可能显示当前状态。知道了这个过程,您可能应该进行一些搜索以找到有关该方法的更多信息。

在您拥有示例代码的情况下,实现相同的一种简单方法是从代码中明确触发调试器:

void Main()
{
    string s = "Test";
    System.Diagnostics.Debugger.Break(); // This will trigger a dialog to attach a debugger
    Console.ReadLine();
    Console.WriteLine(s);
}