【问题标题】:How to redirect a method call?如何重定向方法调用?
【发布时间】:2012-06-07 07:37:57
【问题描述】:

我有一个在 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 并使用 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);
        }
     }
}

【问题讨论】:

  • 不能简单的把DLL的代码改一下重新编译吗?

标签: c# reflection replace .net


【解决方案1】:

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

*可以使用分析挂钩(与调试器使用的挂钩)重定向调用,这就是 Moles Mocking 框架的工作原理。但是它不适合生产使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多