0

This is my next question following writing a byte array from as string using an unknown dll

So I managed to write the byte array, now I want to read it back using the same dll.

I have tried the following:

int BufSize = 60000000;  // Size of file I/O buffers.
int BufSizeM1M = BufSize - 1000000; // The max amount of data read in at any one time.
using (WinFileIO WFIO = new WinFileIO())
{
    WFIO.OpenForReading(path);
    WFIO.ReadBlocks(BufSizeM1M);
    WFIO.Close();
    WFIO.Dispose();
}

this is the WinFileIO.ReadBlocks function:

public int ReadBlocks(int BytesToRead)
        {
            // This function reads a total of BytesToRead at a time.  There is a limit of 2gb per call.
            int BytesReadInBlock = 0, BytesRead = 0, BlockByteSize;
            byte* pBuf = (byte*)pBuffer;
            // Do until there are no more bytes to read or the buffer is full.
            do
            {
                BlockByteSize = Math.Min(BlockSize, BytesToRead - BytesRead);
                if (!ReadFile(pHandle, pBuf, BlockByteSize, &BytesReadInBlock, 0))
                {
                    Win32Exception WE = new Win32Exception();
                    ApplicationException AE = new ApplicationException("WinFileIO:ReadBytes - Error occurred reading a file. - "
                        + WE.Message);
                    throw AE;
                }
                if (BytesReadInBlock == 0)
                    break;
                BytesRead += BytesReadInBlock;
                pBuf += BytesReadInBlock;
            } while (BytesRead < BytesToRead);
            return BytesRead;
        }

My question is, how would one use the function to read an actual file?

4

1 に答える 1

0

少し高いレベルの抽象化で質問に答えるために、「不明な」.NETアセンブリを使用している場合、アセンブリを逆コンパイルして、ソースから何が起こっているかを理解することができます。

逆コンパイルは思ったより簡単です。無料のツールILSpyを使用してアセンブリ(DLL)を開くだけです。次に、C#(またはCIL)で使用しようとしているメソッドのソースを表示できます。

ソースコードを見ると、.NET基本クラスライブラリのどの部分が使用されているかがわかり、そのためのドキュメントを参照したり、理解できないソースコードについてここに別の質問を投稿したりすることもできます。

そのソースがなければ、私たちにできることは、未知のアセンブリがサポートする可能性のあるAPIとワークフローを推測することだけです。

上記の私のアドバイスにもかかわらず、ここに私の推測があります:

  • BufSizeM1Mファイルに大量のデータが含まれていることを確認せずに、ファイルからバイトを読み取ろうとしているようです。

そして、ここにあなたのコードに関する他のいくつかのコメントがあります:

  • を呼び出してWFIO.Dispose();いますがWFIO、usingステートメントで作成されているため、この行は不要です(ただし、これはエラーにはなりません)。
  • WFIO.Close()オブジェクトも廃棄する場合は、が冗長になる可能性があります(そして望ましいです) 。

編集:

WinFileIO.ReadBlocksしたがって、Win32ReadFile関数を使用して、BytesToReadが指すバッファにバイトを読み込むように見えますpBufferWinFileIOバッファにアクセスできる別のメソッドを見つける必要があると思います。秘訣は、他のどのメソッドがpBuffer。たとえば、それをaに変換して、そのbyte[]ように返すメソッドがある可能性があります。これは、次のようになります。

public byte[] GetBuffer()
{
    byte[] bytes=new byte[length];
    for(int i=0; i<length; i++)
    {
        bytes[i]=Marshal.ReadByte(pBuffer,i);
    }
    return bytes;
}
于 2012-10-12T01:03:56.590 に答える