我有一个C#DLL,其代码派生自一个用托管C ++编写的基类。 (我无法控制基类代码)
此基类(在托管C ++中)具有成员
int *buffer
应该是派生类(在C#中)的memset(用零填充)。派生类知道缓冲区的大小。
我正在使用不安全的上下文来访问成员" int * buffer"派生类中的基类。请让我知道有什么特别的方法来设置缓冲区"不安全" c#中的上下文。
我已经查看了这个What is the equivalent of memset in C#?的详细信息,但我想知道有什么特别针对"不安全"上下文。
背景:这是一个转换项目,其中派生类本身之前是托管c ++。现在我将派生类DLL单独转换为C#。我也无法控制基类代码!当前代码流如下:只有派生类知道缓冲区的大小。基类通过从派生中获取缓冲区的大小来为该特定大小创建内存,但它不会填充零。派生类Zero首先填充它,然后需要用其内容适当地填充缓冲区。虽然很奇怪,但就是这样。
谢谢!
答案 0 :(得分:5)
嗯,有... memset。当你可以调用真实物品时,为什么要选择替代品呢?
[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr MemSet(IntPtr dest, int c, IntPtr count);
正如@Hans在OP评论中正确提到的那样,如果你还不知道* buffer的大小,这是没用的。
答案 1 :(得分:1)
您可以自行编码:
void memset( byte* buffer, int value, int size )
{
for( int i = 0; i < count; i++)
{
*( buffer + i ) = value;
}
}
或者您可以使用API。实际上RtlZeroMemory将值设置为零。它实际上并不是memset。
[DllImport("kernel32.dll")]
static extern void RtlZeroMemory(IntPtr dst, int length);
RtlZeroMemory(buffer, bufferLength);
答案 2 :(得分:0)
RtlZeroMemory实际上不是kernel32中的入口点。如果您想要这样的东西,请在C#中使用它
public static unsafe void ZeroMemory(IntPtr Safebuffer, int count)
{
if (count == 0) return;
byte* buffer = (byte*)Safebuffer.ToPointer();
memset(buffer, count);
}
public static unsafe void ZeroMemory(byte* buffer, int count)
{
if (count == 0) return;
while (count-- > 0)
{
buffer[count] = 0;
}
}