【问题标题】:C# disassembly default namespace module classC#反汇编默认命名空间模块类
【发布时间】:2016-12-13 10:04:23
【问题描述】:

我确定这很简单,但我找不到解释。

使用 ILSpy 或 ILDASM 反汇编 .net 时,默认命名空间中有一个名为 <module> 的类。

编译器为什么以及如何将它放在那里? 我有这个:

using abc;
using System;

internal class <Module>
{
    static <Module>()
    {
        AssemblyLoader.Attach();
    }
}
internal interface ISomething
{
}

这不是标准声明。如果我正在重新创建 C# 项目,我将如何添加它? 另外我看到它的方式是在静态构造函数中,并将在入口点之前执行,所以如果我将 AssemblyLoader.Attach(); 放在我的 Main() 或 Program 的静态构造函数中(我正在使用控制台应用程序模板)这应该可以解决问题,对吗?

【问题讨论】:

  • 这对于 C# 是非法的语法,但对于 IL 不是。出于多种原因,编译器始终会生成这些类型的隐式类。简短的回答是,不,你不能重新创建它。
  • 是的,我明白为什么这样称呼它,但我想知道如何让编译器输出相同的东西..
  • 那么如何在我的项目中实现该调用 - AssemblyLoader.Attach();

标签: c#


【解决方案1】:

您不能从 VS 或 C# 代码直接将代码添加到 &lt;Module&gt;。你可以从 IL 做到这一点。

如果您反汇编您的代码,您可以放置​​一个静态的.cctor,它最终将成为&lt;Module&gt; 构造函数。它必须在任何.class 之外

.method private hidebysig specialname rtspecialname static void .cctor () cil managed 
{
    //put your code here
}

你可以在我在 github 上的 repo 中看到an example

或者使用Fody的工具,尤其是ModuleInit

【讨论】:

  • 我了解,但我想在我的 C# 代码中执行此操作。我不需要产生相同的输出,我只需要适当地调用方法
  • @JODE - C# 最接近的事情是使用 Fody。在那里,您可以标记要注入模块的 C# 方法之一。但它仍然以相同的方式完成 - 只是你不需要知道它是如何完成的细节。
猜你喜欢
  • 2015-07-21
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多