反射.发出不安全的代码

本文关键字:代码 不安全 反射 | 更新日期: 2023-09-27 18:33:50

我正在用F#中的反射发出做一些黑客攻击。我正在尝试执行此 C# 代码的等效操作:

var ass = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.RunAndSave);
var mb = ass.DefineDynamicModule("Test", "Test.dll", false);
var t = mb.DefineType("Foo", TypeAttributes.Public, typeof(ValueType));
t.DefineField("foo", typeof(int*), FieldAttributes.Public);
t.CreateType();
ass.Save("Test.dll");

特别是这条线是定义场线。在 F# 中,我能得到的最接近的是

let f = t.DefineField("foo", (typeof<nativeptr<int>>), FieldAttributes.Public)

但是,编译的字段最终编译为 IntPtr 类型而不是 int*。(请注意,它是用于本机或任何其他类型的IntPtr)

此外,我希望能够使用我以编程方式定义的结构,并在另一个结构中具有 Foo*,但显然在这种情况下我无法使用 typeof(在 C# 或 F# 中)。有没有办法从Type/TypeBuilder中将字段定义为Foo*?

在任何人指出这一切都可能是疯狂的(我同意)之前,对于我自己来说,这是一个有趣的项目,让我弄清楚我可以生成 C# 不让我:)的代码有多疯狂

反射.发出不安全的代码

我相信ilsigptr<int>是 C# int*的 F# 对应物。

另请参阅:

  • Don Syme的博客,死链接,见存档副本
  • 在 MSDN 上ilsigptr<'T>,死链接,请参阅存档副本
  • GitHub 上的 F# 源代码