如何重定向方法调用?

时间:2012-06-02 08:15:46

标签: c# reflection replace .net

我有一个在Windows中工作正常的DLL,但在其私有函数之一中调用静态System.IO.File.ReadAllBytes()。我必须在使用Compact Framework 3.5的Windows CE智能设备项目上使用此DLL,并且System.IO.File中没有此类方法。我试图在项目中创建一个名为“File”的类,如下所示:

public class File
{
     internal static byte[] ReadAllBytes(string path)
     {
     }

     internal static void WriteAllBytes(string path, byte[] bytes)
     {
     }
}

我自己调用类File的静态方法在这里被重定向但是DLL方法中的调用仍然转到System.Io.File类,我仍然得到MissingMethodException。我尝试了使用公共修饰符的方法,但没有看到任何变化。

我甚至尝试重写调用ReadAllbytes所在的私有方法的public方法,并使用MethodInfo.Invoke但没有成功。

问题:有没有办法强制Dll中的方法接受我的ReadAllbytes方法而不是System.File.IO.ReadAllBytes()? DLL内部的调用如下:

using System.IO.File;

namespace Something
{
    class SomeClass
    {
        public Boolean someMethod()
        {
            byte[] myBytes = File.ReadAllBytes(filePath);
        }
     }
}

1 个答案:

答案 0 :(得分:0)

File.ReadAllBytes之类的静态方法在编译时被解析为特定的程序集名称和类。您将需要修改DLL以更改调用。很可能你可以反编译并重新编译它,或编辑IL。

*可以使用分析钩子(调试器使用的同一个)重定向调用,这就是Moles Mocking框架的工作方式。但它不适合生产使用。