我目前正在努力破解我的.NET操作系统在MS.NET/Mono之前运行(之前它只运行裸机),而且我遇到了一个小问题。我需要实现我自己的System.Console,它与我的服务基础架构对话,我找不到一个好的方法来替换它,而不是1)没有链接到mscorlib(会很好地做),或者2)使用NotQuiteSystem我的替换的命名空间,会破坏兼容性。
是否有一种机制可以在不执行其中任何操作的情况下干净地替换System类?
编辑:一个想法是使用Mono.Cecil将对System.Console的引用重写为Renraku.System.Console或者其他一些,但我更愿意在框架内工作。
答案 0 :(得分:4)
您应该查看免费工具PostSharp。它允许您通过自动修改MSIL来在设计时更改现有的.Net程序集。
有关PostSharp中编译时编织的更多信息,请参阅this page。和this page有关加载时编织的信息(在程序集加载到内存之前的运行时发生)。
对于运行时编织(在运行时修改现有方法),请查看LinFu。
[页面除外]
...您可以使用LinFu.AOP动态拦截任何类型的任何方法,无论该方法是声明为虚拟还是非虚拟。除了在该类型上声明的任何静态方法之外,您还能够动态拦截(甚至替换)在密封类型上声明的方法。
[/除了页面]
答案 1 :(得分:0)
您是否只想重新定位标准输入和标准输出?如果是这样,Console.SetIn(TextReader in)和Console.SetOut(TextWriter out)正是您正在寻找的。 p>
就其他方法而言,我很确定他们在某些时候都会通过mscorlib。如果负担不起,你可能最终会编写自己的Console类。
答案 2 :(得分:0)
我不认为您对第三方的限制可以从system.console切换。为什么不写一个你想要的新课程或者搜索一个开源的东西。
还有一个替代方案是使用windows powershell,但我认为这也不适用于你的情况
答案 3 :(得分:0)
如何关于控制台方法的间接性。使用反射加载函数指针到你需要的函数,然后你可以有一个配置文件,提供要使用的函数的实际名称
即在您的代码中,您调用DoConsoleRead
在加载时,DoConsoleRead会指向某个任意函数
答案 4 :(得分:0)
我认为可以使用“属性”表中的“引用”节点来完成。 看一下这个例子:http://www.codeproject.com/KB/mobile/Wm2005Globalization2.aspx。 它“修复”Compact Framework中的一个类,我认为你可以使它在完整的框架中工作,但我现在可以测试它。 (没有VS在工作)
答案 5 :(得分:0)
如何在您的操作系统上运行ROTOR(SSCLI)? 在那里,您还拥有完整的源代码和底层操作系统的抽象 http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang=en
花了一些时间在使用MS .NET的Reflector中,我们都知道它与WIN 32 API紧密相关,这只会使你的操作系统看起来更像Windows,然后成为一个新的干净的操作系统。
除此之外,重写引用似乎是一个可行的选择。
答案 6 :(得分:0)
如何更换GAC中的System类? 我知道Java有一个bootclasspath开关定义Java“bootstrap”类的位置-java.lang.Object,java.lang.Exception等等