如何覆盖基类\结构,如int,string?

时间:2015-04-13 19:41:04

标签: c# reflection decompiling il

减少downvotes :(起初可跳过)

  

我知道这个问题听起来毫无意义和/或奇怪。我正在创建JIT,它使用C#代码用csc.exe编译它,提取IL并将它平行化为CUDA,我想覆盖C#中的一些东西。

如何覆盖基本内容,例如int \ string? 我试过了:

class String { /* In namespace System of course */
    BasicString wrap_to;
    public String( ) {
        wrap_to = new BasicString( 32 ); // capacity
    }
    public String( int Count ) {
        wrap_to = new BasicString( Count );
    }
    public char this[ int index ] {
        get { return wrap_to[ index ]; }
        set {
            if ( wrap_to.Handlers != 1 )
                wrap_to = new BasicString( wrap_to );
            wrap_to[ index ] = value;
        }
    }
    ...
}
... // not in namespace System now
class Test {
    public static void f(string s) { }
}

但是当我尝试时:

Test.f( new string( ) );

错误Cannot implicitly convert type 'System.String' to 'string'。我尝试将我的System.String移动到全局范围内的string,并且它在类本身上出错了。有什么想法?我想如果我可以在没有.cs的情况下编译我的mscorlib.dll文件,它会有所帮助,但我找不到办法。

即使是访问csc.exe源代码的方法也许有帮助。 (这很关键。)

2 个答案:

答案 0 :(得分:2)

是的,您不得参考mscorlib.dll。否则会有两个System.String类,显然预定义的(给定的C#规范)类型string不能同时属于它们。

/nostdlib C# compiler option。该页面还介绍了如何使用Visual Studio IDE中的设置执行此操作。

当您不引用mscorlib.dll时,您需要编写许多其他必需类型(或复制粘贴它们)!

答案 1 :(得分:2)

  

即使是访问csc.exe源代码的方法也许有帮助。 (这很关键。)

根据您的评论判断,这实际上是您真正需要的。 (尝试更改intstring本身将涉及更改mscorlib,几乎肯定也会更改CLR。哎哟。)

幸运的是,你很幸运:微软开源Roslyn,这是下一代C#编译器,将随Visual Studio 2015一起提供。

如果要更改编译器的行为方式,可以分叉代码并对其进行适当修改。如果你真的只需要了解抽象语法树(等等),那么你可以在不改变编译器的情况下做到这一点--Roslyn被设计成一个“编译器API”,而不仅仅是一个黑盒子,它接收来源代码并吐出IL。 (作为API的丰富程度的标志,Visual Studio 2015使用公共API处理所有内容 - 智能感知,重构等)。