获取用于编译.net语言的元数据

获取用于编译.net语言的元数据,.net,compiler-construction,language-design,.net,Compiler Construction,Language Design,我正在玩弄一种针对.Net平台的新语言的概念验证。我已经对词法分析/解析器的事情进行了大致的分类。虽然我很懒,但我只是打算使用CodeDom生成C#,而不是在此时发出IL,然后编译它 但是,为了为我的语法生成正确的C#,我需要能够为“编译器”提供引用程序集的所有元数据,以便我可以查找所有类、方法、参数、接口等。最好的方法是什么 我想我可以将所有程序集加载到它们自己的appdomain中,并通过反射查询它们,但这似乎有点笨拙。我猜另一种方法是将所有元数据提取到可以轻松高效地加载和查询的内容中 另一

我正在玩弄一种针对.Net平台的新语言的概念验证。我已经对词法分析/解析器的事情进行了大致的分类。虽然我很懒,但我只是打算使用CodeDom生成C#,而不是在此时发出IL,然后编译它

但是,为了为我的语法生成正确的C#,我需要能够为“编译器”提供引用程序集的所有元数据,以便我可以查找所有类、方法、参数、接口等。最好的方法是什么

我想我可以将所有程序集加载到它们自己的appdomain中,并通过反射查询它们,但这似乎有点笨拙。我猜另一种方法是将所有元数据提取到可以轻松高效地加载和查询的内容中

另一种方法是从system.NETFramework目录加载XML元数据文件,但这似乎也有点笨拙

似乎这应该是默认编译器本身要解决的问题,我是否缺少一些明显的方法来实现这一点

编辑
这可能是实现它的方法,但仍然很好奇编译器是如何实现的

您可以尝试一下。这将只加载请求的程序集,而不加载依赖项。但是,卸载仍然是不可能的(如果不卸载整个appdomain)。

完全管理的库的最佳方法是按照项目页面上的说明使用:

用简单的英语,和塞西尔一起,你可以 加载现有托管程序集, 浏览所有包含的类型,修改 他们在飞行中,并保存回 将修改后的程序集放入磁盘


它是维护的,许可证使它即使在商业项目中也可用。

编译器通常会像加载任何其他数据文件一样加载程序集(使用前面提到的Cecil或CCI元数据库)。与运行时的反射支持相比,它速度更快,占用的内存更少。

C#和VB编译器有一个内部库,可以从PE格式读取元数据,并以其原始形式进行解释。我认为许多托管库都做了同样的事情——metdata格式是开放的,并且有很好的文档记录(只需搜索ECMA CLI规范),它比通过CLR更安全(因为代码是作为位读取的,而不是加载到运行时中),而且通常更快


如果/当团队完成他们讨论的“编译器即服务”长期计划时,编译器团队可能会直接提供一些东西,但这是:a)将在未来的某个模糊和不确定的时间,b)纯粹是我的猜测。现在,我来看看其他人指向的一些库。

您需要元数据的具体用途是什么?您是否试图使玩具语言中的对象可以从其他.net代码中使用,或者反之亦然?或者,您只是想在全局程序集缓存中找到某些程序集的位置,以便正确调用C#编译器?是的,我需要与不同程序集中的类以及一些接口进行交互