2

Windows で正常に動作する DLL を取得しましたが、そのプライベート関数の 1 つの内部で、静的な 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 が引き続き発生します。public 修飾子を使用してメソッドを試しましたが、変化は見られませんでした。

ReadAllbytes が呼び出され、MethodInfo.Invoke を使用したプライベート メソッドを呼び出すパブリック メソッドを書き直そうとしましたが、成功しませんでした。

質問: Dll 内のメソッドが System.File.IO.ReadAllBytes() の代わりに ReadAllbytes メソッドを受け入れるようにする方法はありますか? DLL 内の呼び出しは次のようになります。

using System.IO.File;

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

1 に答える 1

0

File.ReadAllBytes のような静的メソッドは、コンパイル時に特定のアセンブリ名とクラスに解決されます。呼び出しを変更するには、DLL を変更する必要があります。逆コンパイルして再コンパイルするか、ILを編集することができます。

*プロファイリング フック (デバッガーが使用するものと同じ) を使用して呼び出しをリダイレクトすることが可能であり、それが Moles Mocking フレームワークのしくみです。ただし、本番環境での使用には適していません。

于 2012-06-02T08:21:36.023 に答える