gpt4 book ai didi

c# 反射(或另一种通过注入(inject)的 dll 获取类值的方法)

转载 作者:行者123 更新时间:2023-11-30 17:58:15 25 4
gpt4 key购买 nike

在过去的 3 周里,我一直在网上搜索,试图让它发挥作用,但我没有任何运气。

背景小故事:将 C# .NET 4.0 DLL 注入(inject) .NET 4.0 应用程序。

(我可以使用用 C++ 编写的引导 DLL 注入(inject)我的 DLL,并可以调用应用程序中的函数)

我可以让这段代码工作,但我想做的是获取“实际”值,而不是创建该类的新实例。

下面是反射以我不希望的方式工作的工作示例,我不确定反射是否是我此时需要使用的。还是我找错了树?

namespace TestFormsApp4
{
static class Program
{
private static TestClass1 Test = new TestClass1("from class 1");
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
BindingFlags Binding = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
Assembly App = Assembly.Load("TestFormsApp4");
//Get the TestFormsApp4.Program (static) type
Type Test1C = App.GetType("TestFormsApp4.Program");
//get the testclass2 field (TestClass2 testclass2;)
var Test1F = Test1C.GetField("Test", Binding);
//get the value from the field
var Test2C = Test1F.GetValue(Test1C);

Application.Run(new Form1());
}
}
}

namespace TestName1
{
class TestClass1
{
public bool testbool = false;
public TestClass2 testclass2;
public TestClass1(String SetString)
{
this.testclass2 = new TestClass2(SetString);
}
}
}

namespace TestName2
{
class TestClass2
{
public String teststring;
public TestClass2(String SetString)
{
teststring = SetString;
}
}
}

最佳答案

是的,该代码无效。您必须获得对您​​感兴趣的类的现有实例的引用。创建一个新实例不会给您带来任何好处,除了您自己在此类实例上设置的属性。这样的引用可能很难获得,无法迭代垃圾收集堆上的对象。

您必须在程序中需要一个static 变量来跟踪创建的实例。有一个暗示可能存在这样的变量,看起来你正在用表单做一些事情。 Application.OpenForms 是一个引用已打开表单集合的静态变量。您可以迭代它并使用 GetType() 来查找特定表单类型的实例。只要该表单对象存储对“TestClass”实例的引用,您就可以使用反射将其挖掘出来。还有 ManagedSpy++ 工具的工作方式。

关于c# 反射(或另一种通过注入(inject)的 dll 获取类值的方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com