相当于C#中的memset"不安全"码

时间:2015-01-18 11:29:26

标签: c# c++-cli

我有一个C#DLL,其代码派生自一个用托管C ++编写的基类。 (我无法控制基类代码)

此基类(在托管C ++中)具有成员

int *buffer

应该是派生类(在C#中)的memset(用零填充)。派生类知道缓冲区的大小。

我正在使用不安全的上下文来访问成员" int * buffer"派生类中的基类。请让我知道有什么特别的方法来设置缓冲区"不安全" c#中的上下文。

我已经查看了这个What is the equivalent of memset in C#?的详细信息,但我想知道有什么特别针对"不安全"上下文。

背景:这是一个转换项目,其中派生类本身之前是托管c ++。现在我将派生类DLL单独转换为C#。我也无法控制基类代码!当前代码流如下:只有派生类知道缓冲区的大小。基类通过从派生中获取缓冲区的大小来为该特定大小创建内存,但它不会填充零。派生类Zero首先填充它,然后需要用其内容适当地填充缓冲区。虽然很奇怪,但就是这样。

谢谢!

3 个答案:

答案 0 :(得分:5)

嗯,有... memset。当你可以调用真实物品时,为什么要选择替代品呢?

[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr MemSet(IntPtr dest, int c, IntPtr count);

取自pinvoke.net

修改

正如@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;
        }
    }