减少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源代码的方法也许有帮助。 (这很关键。)
答案 0 :(得分:2)
是的,您不得参考mscorlib.dll
。否则会有两个System.String
类,显然预定义的(给定的C#规范)类型string
不能同时属于它们。
见/nostdlib
C# compiler option。该页面还介绍了如何使用Visual Studio IDE中的设置执行此操作。
当您不引用mscorlib.dll
时,您需要编写许多其他必需类型(或复制粘贴它们)!
答案 1 :(得分:2)
即使是访问csc.exe源代码的方法也许有帮助。 (这很关键。)
根据您的评论判断,这实际上是您真正需要的。 (尝试更改int
和string
本身将涉及更改mscorlib
,几乎肯定也会更改CLR。哎哟。)
幸运的是,你很幸运:微软开源Roslyn,这是下一代C#编译器,将随Visual Studio 2015一起提供。
如果要更改编译器的行为方式,可以分叉代码并对其进行适当修改。如果你真的只需要了解抽象语法树(等等),那么你可以在不改变编译器的情况下做到这一点--Roslyn被设计成一个“编译器API”,而不仅仅是一个黑盒子,它接收来源代码并吐出IL。 (作为API的丰富程度的标志,Visual Studio 2015使用公共API处理所有内容 - 智能感知,重构等)。