Zeiger auf ein internes Leadonly -Feld bringen
Posted: 10 Apr 2025, 10:39
Ich bin tiefer in das Verständnis von Reflexion und Zeigern und stieß auf eine interessante Herausforderung. Sagen Sie, Sie haben die folgende Klasse: < /p>
, aber ein neuer Wert in diesen ist nicht zulässig, da es sich bei der Vergleiche und "Code -Zugriffssicherheit" befindet.
Ich habe darüber nachgedacht, Zeiger mit unsicherem zu verwenden, um dieses Feld zu ändern:
Dies funktioniert insofern, als es die Variable der Balken für Foo ändert, aber nicht das Feld ändert, da die Variable der Balken eine "Kopie" des statischen Feldes ist, nicht das Feld selbst.>
Code: Select all
namespace Foobar
{
internal class Foo()
{
internal static readonly Me = new Foo();
}
}
< /code>
Ich kann den Wert des Feldes einfach mit folgendem erhalten: < /p>
Assembly a = Assembly.Load("AssemblyWithFoo");
Type t = a.GetType("Foobar.Foo");
FieldInfo fi = t.GetRuntimeFields().First(f => f is { Name: "Me", IsStatic: true });
var bar = fi.GetValue(null);
Code: Select all
fi.SetValue(null, new Foo());
Code: Select all
var foo = GetFooFromAssembly();
var bar = fi.GetValue(null);
unsafe
{
object* ptr = &bar;
*ptr = foo;
}