反编译c#动态操作时看到的语法实际意味着什么?

时间:2015-08-23 09:55:05

标签: c# dynamic decompiler ilspy

我最近不得不在他们离开时反编译一个同事的代码,并发现它的大部分看起来都非常好(感谢ILSpy),但有一个明显的例外。我们需要使用dynamic的几个地方 - 这些地方被分成几个部分:

  1. 一个调用网站容器 - 即类似于定义中的类,但是让我们说使用dynamic的方法是DoStuff,会有public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }的声明。 {1}}
  2. 许多代码检查容器中是否已分配了各种CallSite,并在使用前根据需要使用我真正尚未获得的方法进行分配。
  3. 我的问题是关于第1点中类声明的语法。它看起来像一个普通的类,但它显然不是。任何人都可以解释那里发生了什么吗?

    请注意,我没有在编写原始代码时寻求帮助 - 我已经设法通过明智地使用查找和替换以及从其他所有内容中分解自动生成的代码来实现这一点。但我想了解CallSite容器语法是一个有效的类名!

1 个答案:

答案 0 :(得分:3)

以下是此类自动生成类的示例:

private static class <>o__0
{
    public static CallSite<Action<CallSite, Type, object>> <>p__0;
}

如果您担心<>o__0类名称和<>p__0字段名称,那么您是对的,那些不是有效的C#名称,但这并不意味着它们不是有效的IL名称这是编译器生成的内容。它使用这些特殊符号的原因是为了确保它们永远不会与您作为开发人员可能编写的类名冲突。