如何重写 base classes\structs 比如 int, string?
How to override base classes\structs such as int, string?
减少反对票:(一开始可以跳过)
I am aware that this question sounds pointless and\or weird. I am creating JIT that takes C# code compiles it with csc.exe, extracts the IL and parallize it into CUDA, and I want to override some of the things in 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
并且它在 class 本身上出错。任何想法如何?我认为如果我可以在没有 mscorlib.dll
的情况下编译我的 .cs
文件,它可能会有所帮助,但我找不到方法来做到这一点。
即使是获取 csc.exe 源代码的方法也可能有所帮助。 (这很关键。)
是的,您将不必引用 mscorlib.dll
。否则会有两个System.String
类,显然预定义的(给定的C#规范)类型string
不能是它们两个。
参见 /nostdlib
C# compiler option。该页面还介绍了如何使用 Visual Studio IDE.
中的设置进行操作
当您不参考 mscorlib.dll
!
时,您确实需要编写许多其他必需的类型(或复制粘贴它们)
Even a way to reach to csc.exe source code may help. (This is critical.)
从您的评论来看,这实际上是您真正需要的部分。 (尝试更改 int
和 string
本身将涉及更改 mscorlib
并且几乎肯定还会更改 CLR。哎呀。)
幸运的是,您很幸运:Microsoft 开源了 Roslyn,下一代 C# 编译器将在 Visual Studio 2015 中发布。
如果您想更改编译器的行为方式,您可以分叉代码并对其进行适当修改。如果您真的只需要获取抽象语法树(等等),那么您完全可以在不更改编译器的情况下做到这一点——Roslyn 被设计成一个 "compiler API" 而不仅仅是一个黑盒子,它接受源代码并吐出 IL。 (作为 API 多么丰富的标志,Visual Studio 2015 对所有内容都使用 public API - 智能感知、重构等)
减少反对票:(一开始可以跳过)
I am aware that this question sounds pointless and\or weird. I am creating JIT that takes C# code compiles it with csc.exe, extracts the IL and parallize it into CUDA, and I want to override some of the things in 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
并且它在 class 本身上出错。任何想法如何?我认为如果我可以在没有 mscorlib.dll
的情况下编译我的 .cs
文件,它可能会有所帮助,但我找不到方法来做到这一点。
即使是获取 csc.exe 源代码的方法也可能有所帮助。 (这很关键。)
是的,您将不必引用 mscorlib.dll
。否则会有两个System.String
类,显然预定义的(给定的C#规范)类型string
不能是它们两个。
参见 /nostdlib
C# compiler option。该页面还介绍了如何使用 Visual Studio IDE.
当您不参考 mscorlib.dll
!
Even a way to reach to csc.exe source code may help. (This is critical.)
从您的评论来看,这实际上是您真正需要的部分。 (尝试更改 int
和 string
本身将涉及更改 mscorlib
并且几乎肯定还会更改 CLR。哎呀。)
幸运的是,您很幸运:Microsoft 开源了 Roslyn,下一代 C# 编译器将在 Visual Studio 2015 中发布。
如果您想更改编译器的行为方式,您可以分叉代码并对其进行适当修改。如果您真的只需要获取抽象语法树(等等),那么您完全可以在不更改编译器的情况下做到这一点——Roslyn 被设计成一个 "compiler API" 而不仅仅是一个黑盒子,它接受源代码并吐出 IL。 (作为 API 多么丰富的标志,Visual Studio 2015 对所有内容都使用 public API - 智能感知、重构等)