替换系统命名空间中的类

14

我目前正在努力将我的.NET操作系统移植到MS.NET/Mono上运行(之前只能在裸机上运行),但是遇到了一些问题。我需要实现自己的System.Console以便与我的服务基础设施进行通信,但是我找不到一个好方法来替换它,如果不选择以下两种方式:"1) 不链接mscorlib(非常麻烦)" 或者 "2) 在我的替换中使用NotQuiteSystem命名空间,这会破坏兼容性"。

是否有一种机制可以干净地替换System类,而不必采取以上措施呢?

编辑:一个想法是使用Mono.Cecil将对System.Console的引用重写为Renraku.System.Console等,但如果可能的话,我更愿意在框架内解决。


1
据我所了解,你正在尝试构建一台虚拟机主机,而不是操作系统。 - Jader Dias
@Cody,那么使用<assemblyBinding />怎么样? - Rubens Farias
@Jader Dias:不,它完全是一个操作系统。目前它是在裸机上运行的(将自身编译成机器码),但除了内存/对象/中断管理器之外的所有内容都可以在任何.NET实现上运行。 - Serafina Brocious
你为什么想要重新连接System.Console?是因为你希望在你的操作系统上运行的.NET应用程序使用它并在你的操作系统控制台中编写,而不是在.NET主机环境中编写吗? - Jader Dias
所有内容都是公开的。您可以在 http://github.com/daeken/RenrakuOS/ 上查看源代码,并在 http://daeken.com/renraku-future-os 了解更多关于该项目的信息。 - Serafina Brocious
显示剩余6条评论
7个回答

4
你应该了解一下免费的工具PostSharp。它可以让你在设计时自动修改MSIL,从而改变现有的.Net程序集。
查看此页面以获取有关PostSharp编译时织入的更多信息,以及此页面以获取有关加载时织入(在程序集加载到内存中之前运行)的信息。
如果要进行运行时织入(在运行时修改现有方法),请查看LinFu

[摘自页面]

... 您可以使用LinFu.AOP动态拦截任何类型上的任何方法,无论该方法是否声明为虚方法或非虚方法。您还将能够动态拦截(甚至替换)在封闭类型上声明的方法,以及在该类型上声明的任何静态方法。

[/摘自页面]


谢谢提供的信息。虽然不完全适合我的情况,但似乎这是我能找到的最好的解决方案。 - Serafina Brocious

0

你只是想重定向标准输入和标准输出吗?如果是这样,Console.SetIn(TextReader in)Console.SetOut(TextWriter out) 正是你要找的。

至于其他方法,我相信它们最终都会经过 mscorlib。如果你承受不起这个代价,最终可能还是要自己编写 Console 类。


我们需要更低级别的控制台访问权限,例如颜色、缓冲区大小等。因此,我们需要能够替换整个类。看起来唯一的解决方法是使用Mono.Cecil重写引用。 - Serafina Brocious

0

我认为在你限制第三方的情况下,你无法从system.console切换。为什么不编写一个新类来实现你想要的功能或者搜索开源库呢。

还有一种选择是使用Windows PowerShell,但我认为在你的情况下也不会起作用。


0

关于在控制台方法上进行间接操作,您可以使用反射来加载函数指针以获取所需的函数,然后您可以有一个配置文件提供要使用的实际函数名称

例如,在您的代码中调用DoConsoleRead

在加载时,DoConsoleRead被指向某个任意函数


0
我认为可以使用属性表中的“引用”节点来实现。 看看这个例子:http://www.codeproject.com/KB/mobile/Wm2005Globalization2.aspx。 它“修复”了一个在简化框架中的类,我认为你可以让它在完整的框架中工作,但我现在无法测试它。(工作时没有VS)

0

由于ROTOR受到污染许可证的限制,如果Renraku开发人员接触它,将会成为严重的法律问题;它将阻止我们能够开展自己的运行时工作,并使我们的操作系统有效地无法自由使用。由于操作系统的架构,特定于平台(托管)的功能被隔离到不同的服务中,这使我们能够保持自己的风格。看起来,参考重写是最好的方法。 - Serafina Brocious
Cody,我一直在研究更多的托管操作系统。现在我完全理解你的观点了。看起来来自COSMOS和MOSA的志同道合的人们都遇到了相同的问题。 在我看来,如果你们想要成功,应该都同意共同开发一个“托管操作系统”。至少有三个项目需要分散太多工作量。 - Rudi

0

替换GAC中的System类怎么样? 我知道Java有一个bootclasspath开关,可以定义Java“引导”类的位置-java.lang.Object、java.lang.Exception等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接