c# - 反编译c#动态操作时看到的语法到底是什么意思?

标签 c# dynamic decompiler ilspy

我最近不得不尝试在同事不在的时候反编译他们的代码,发现大部分代码看起来都非常好(感谢 ILSpy),除了几个我们需要的地方使用 dynamic - 这些被分解成几个部分:

  1. 调用站点容器——即在定义上类似于一个类,但让我们说一下 dynamic 所在的方法使用的是DoStuff , 将有一个类似 public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ } 的声明
  2. 很多代码检查容器内的各种 CallSites 是否已分配,并在使用前根据需要使用我还没有真正了解的方法分配它们。

我的问题是关于第 1 点中类声明的语法。它看起来 像一个泛型类,但显然不是。谁能解释一下那里发生了什么?

请注意,我不是在寻找原始代码的帮助 - 我已经通过明智地使用查找和替换以及从其他所有内容中分离出自动生成的代码来设法做到这一点。但我想了解 CallSite 容器语法如何成为有效的类名!

最佳答案

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

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

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

关于c# - 反编译c#动态操作时看到的语法到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32165361/

相关文章:

c# - 使用 C# 执行卸载

c# - ASP.NET Web API堆栈跟踪不可用-使用ProblemDetails

parsing - 是否有在您键入时解析的解析器?

java - 反编译 java 类文件的最佳软件是什么?

java - 如何反编译泛型中的桥接方法?

c# - 如何将一批 .NET DLL 反编译为 Visual Studio 项目

c# - System.InvalidOperationException : Value must be set. 为 SQLite 设置空参数

c# - 如何从 FTP 显示下载进度

javascript - 如何动态地将函数附加到对象

c# - 无法定义使用 'dynamic' 的类或成员,因为编译器需要类型 'System.Runtime.CompilerServices.DynamicAttribute'