.NET中类等级的加载器

时间:2008-10-09 03:31:03

标签: .net compiler-construction programming-languages clr language-features

有谁知道是否可以在.NET中定义“java自定义类加载器”的等价物?

提供一些背景知识:

我正在开发一种针对CLR的新编程语言,称为“Liberty”。该语言的一个特性是它能够定义“类型构造函数”,它是编译器在编译时执行并生成类型作为输出的方法。它们是泛型的泛化(该语言确实具有普通泛型),并允许编写这样的代码(使用“Liberty”语法):

var t as tuple<i as int, j as int, k as int>;
t.i = 2;
t.j = 4;
t.k = 5;

“tuple”的定义如下:

public type tuple(params variables as VariableDeclaration[]) as TypeDeclaration
{
   //...
}

在这个特定的例子中,类型构造函数tuple提供类似于VB和C#中的匿名类型。

但是,与匿名类型不同,“元组”具有名称,可以在公共方法签名中使用。

这意味着我需要一种最终由编译器发出的类型的方法,以便在多个程序集之间共享。例如,我想要

在程序集A中定义的

tuple<x as int>最终与程序集B中定义的tuple<x as int>类型相同。

当然,问题是程序集A和程序集B将在不同的时间进行编译,这意味着它们最终都会发出它们自己不兼容的元组类型版本。

我考虑使用某种“类型擦除”来执行此操作,因此我将拥有一个包含这类类型的共享库(这是“Liberty”语法):

class tuple<T>
{
    public Field1 as T;
}

class tuple<T, R>
{
    public Field2 as T;
    public Field2 as R;
}

然后只需将i,j和k元组字段的访问权限重定向到Field1Field2Field3

然而,这不是一个可行的选择。这意味着在编译时tuple<x as int>tuple<y as int>最终会成为不同的类型,而在运行时它们将被视为相同的类型。这会对平等和类型识别等问题造成许多问题。这对我的口味来说太过疏漏。

其他可能的选择是使用“状态包对象”。但是,使用状态包会破坏支持语言中“类型构造函数”的全部目的。其目的是启用“自定义语言扩展”以在编译时生成新类型,编译器可以使用它来执行静态类型检查。

在Java中,这可以使用自定义类加载器来完成。基本上,可以在不实际定义磁盘类型的情况下发出使用元组类型的代码。然后可以定义一个自定义的“类加载器”,它将在运行时动态生成元组类型。这将允许在编译器内部进行静态类型检查,并将跨编译边界统一元组类型。

不幸的是,CLR不支持自定义类加载。 CLR中的所有加载都在汇编级别完成。可以为每个“构造类型”定义一个单独的程序集,但这很快就会导致性能问题(许多程序集中只有一种类型会使用太多资源)。

所以,我想知道的是:

是否可以在.NET中模拟类似Java类加载器的东西,我可以在其中发出对不存在类型的引用,然后在运行时动态生成对该类型的引用,然后需要使用它的代码运行?

注意:

*我实际上已经知道了问题的答案,我在下面提供了答案。然而,我花了大约3天的研究时间,以及相当多的IL黑客攻击来提出解决方案。我认为在这里记录它是个好主意,以防其他人遇到同样的问题。 *

2 个答案:

答案 0 :(得分:52)

答案 1 :(得分:-5)

我认为这是DLR应该在C#4.0中提供的类型。有点难以获得信息,但也许我们会在PDC08上了解更多信息。急切地等着看你的C#3解决方案......我猜它使用的是匿名类型。