减少反对票:(一开始可以跳过)
我知道这个问题听起来毫无意义和/或奇怪。我正在创建 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
,但它在类本身上出错了。有什么想法吗?我认为如果我可以在没有那个mscorlib.dll
的情况下编译我的 .cs
文件,它会有所帮助,但我找不到一种方法来做到这一点。
即使是访问 csc.exe源代码的方法也可能有所帮助。(这很关键。
是的,您不必引用mscorlib.dll
.否则,将有两个System.String
类,显然预定义的(给定的 C# 规范)类型 string
不能同时是这两个类。
请参阅 /nostdlib
C# 编译器选项。该页还介绍了如何使用Visual Studio IDE中的设置来执行此操作。
当您不引用时,您需要编写许多其他必需的类型(或复制粘贴它们mscorlib.dll
!
即使是访问 csc.exe源代码的方法也可能有所帮助。(这很关键。
从您的评论来看,这实际上是您真正需要的一点。(试图改变int
和string
本身将涉及改变mscorlib
,几乎可以肯定的是,CLR也是如此。哎哟。
幸运的是,你很幸运:Microsoft开源了Roslyn,这是Visual Studio 2015附带的下一代C#编译器。
如果要更改编译器的行为方式,可以分叉代码并对其进行适当的修改。如果你真的只需要获取抽象语法树(等等),那么你可以在不更改编译器的情况下做到这一点 - Roslyn 被设计成一个"编译器 API",而不仅仅是一个接受源代码并吐出 IL 的黑盒。 (作为 API 丰富程度的标志, Visual Studio 2015 使用公共 API 处理所有内容 - 智能感知、重构等。