这是我在writing a byte array from as string using an unknown dll
之后的下一个问题所以我设法写了字节数组,现在我想用同样的dll读回来。
我尝试了以下内容:
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();
}
这是WinFileIO.ReadBlocks函数:
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;
}
我的问题是,如何使用该函数读取实际文件?
答案 0 :(得分:0)
要尝试以稍高的抽象级别回答您的问题,如果您正在使用“未知”的.NET程序集,您可以尝试的一件事是反编译程序集并计算出源代码中发生的事情
反编译比听起来容易。只需使用免费工具ILSpy打开程序集(DLL)即可。然后,您可以查看您尝试在C#(甚至CIL)中使用的方法的来源。
查看源代码将让您了解.NET基类库的哪些部分正在使用,并查阅相关文档,或者在此处发布有关您不理解的源代码的其他问题。
如果没有这个来源,我们所能做的就是猜测未知程序集支持的可能的API和工作流程。
尽管我的建议如上,但这是我的猜测:
BufSizeM1M
字节而不检查它是否包含那么多数据。以下是对您的代码的一些其他评论:
WFIO.Dispose();
,但WFIO
是在using语句中创建的,因此该行是不必要的(但这不会是错误)。WFIO.Close()
是多余的是可能的(也是可取的)。修改强>
所以看起来WinFileIO.ReadBlocks
使用Win32 ReadFile
函数将BytesToRead
字节读入pBuffer
指向的缓冲区。我想你需要在WinFileIO
上找到另一种方法,让你可以访问缓冲区。诀窍是看看哪些其他方法对pBuffer
做了些什么。例如,可能有一个方法将其转换为byte[]
并将其返回给您,这可能看起来像这样:
public byte[] GetBuffer()
{
byte[] bytes=new byte[length];
for(int i=0; i<length; i++)
{
bytes[i]=Marshal.ReadByte(pBuffer,i);
}
return bytes;
}