我正在为针对.Net平台的新语言做一个概念验证。我对lexing / parser事情进行了很多分类。像我一样懒惰我只是使用CodeDom生成C#而不是在此时发出IL然后只编译它。
但是,为了为我的语法生成正确的C#,我需要能够为“编译器”提供所引用程序集的所有元数据,这样我就可以查找所有类,方法,参数,接口等。什么是最好的方法。
我想我可以将所有程序集加载到他们自己的appdomain中并通过反射查询它们但它看起来有点笨拙。我想的另一种方法是将所有元数据提取到可以轻松和高效地加载和查询的内容中。
另一种方法是从系统.Net框架目录加载XML元数据文件,但这看起来有点笨拙
看起来这应该是默认编译器本身会解决的问题,我是否遗漏了一些明显的方法来做到这一点?
此CCI metadata可能是这样做的方法,但仍然很好奇编译器如何完成它
答案 0 :(得分:1)
C#和VB编译器有一个内部库,它从PE格式中读取元数据并以原始形式解释它。我认为许多托管库都做同样的事情 - 元数据格式是开放的并且有很好的文档记录(只是搜索ECMA CLI规范),它比通过CLR更安全(因为代码被读作比特而没有加载到一个运行时),通常更快。
如果/当团队完成他们讨论的“编译器即服务”长期计划时,可能会有一些实际上可以直接从编译器团队获得的东西,但那是:a)将会处于一些模糊且未确定的时间在未来,和b)我纯粹的猜测。所以现在,我会看一些其他人指向的库。
答案 1 :(得分:0)
您可以尝试Assembly.ReflectionOnlyLoad
。这只会加载请求的程序集,而不会加载依赖项。但是,卸载仍然是不可能的(没有卸载整个appdomain)。
答案 2 :(得分:0)
完全托管库的最佳方法是使用项目页面中描述的Cecil:
简单的英语,塞西尔,你可以 加载现有的托管程序集 浏览所有包含的类型,修改 他们在飞行中并保存回来 磁盘修改后的程序集。
它得到维护,open source并且许可证使其即使在商业项目中也可以使用。
答案 3 :(得分:0)
编译器通常会像任何其他数据文件一样加载程序集(使用类似已提到的Cecil或CCI元数据库)。它比运行时的反射支持更快,占用的内存更少。