C# 如何使用Reflection.Emit添加引用

C# 如何使用Reflection.Emit添加引用,c#,reflection,dll,il,C#,Reflection,Dll,Il,我正在为一种在.NET framework上运行的语言编写编译器。我正在尝试为导入语句生成代码。基本上 import System.Drawing 应该表现得像 using System.Drawing; 在C#中。import语句还将支持以下内容: import Foo.Bar in "foo.dll" 它将导入Foo.dll中的Foo.Bar类。我的问题是如何使用Reflection.Emit将这些链接到生成的程序中 谢谢。你只要:使用图书馆。也就是说,您只需在发出的代码中使用foo.

我正在为一种在.NET framework上运行的语言编写编译器。我正在尝试为导入语句生成代码。基本上

import System.Drawing
应该表现得像

using System.Drawing;
在C#中。import语句还将支持以下内容:

import Foo.Bar in "foo.dll"
它将导入Foo.dll中的Foo.Bar类。我的问题是如何使用Reflection.Emit将这些链接到生成的程序中


谢谢。

你只要:使用图书馆。也就是说,您只需在发出的代码中使用foo.dll中的类型/方法。
Reflection.Emit
包装器将自动添加必要的引用元数据。请注意,这意味着如果您的代码导入一个库,然后不使用它,那么该引用将不存在于生成的IL中。有趣的是,这正是C#编译器(可能是VB编译器)所做的。

好的,所以我需要使用foo.dll上的反射来获取方法和类,并在发出的il中简单地使用它们?同样有趣的是,C#做到了这一点,所以未使用的引用不会导入任何内容吗?@mirhagk是的,没错that@mirhagk另外,您可能会发现值得一看IKVM.Reflection.dll;它有相同的API,但有一些稍好的功能,例如能够以完全隔离的方式加载程序集,甚至允许为不同的框架生成dll—例如,为WinRT、Silverlight、Windows Phone 7等生成dll—所有这些都来自.NET 2(或更高版本)exe.2关于IKVM.Reflection.dll的问题。首先,它是否稳定/经过测试(看起来相当不错),其次,你说它为多个平台生成,它是否也在这些平台上运行?(网络和电话会很酷)@mirhagk是的,它是稳定的,等等,虽然我确实发现了一些小故障,但不到一天就修复好了。您可以在这些平台上使用生成的程序集,但IKVM.Reflection本身是一个完整的.net(2.0 iirc)程序集。如果这是你的计划,你不能用它来绕过iOS上的元编程限制。