在C#中使用C/C++库的方法返回一个随机值,而不是上面的返回

Posted

技术标签:

【中文标题】在C#中使用C/C++库的方法返回一个随机值,而不是上面的返回【英文标题】:Using the method of C/C++ libraries in C # return a random value, instead of the above in return 【发布时间】:2015-08-28 11:02:07 【问题描述】:

当我从 C++ DLL 调用 C# 函数时,它返回一个随机值,例如:

17700591018967041

Source.cpp(DLL C++ 的一部分,我在 C# 应用程序中使用):

extern "C"

    __declspec(dllexport) uLong ZEXPORT Source()
    
        return 1;
    

Program.cs(C# 应用程序):

...Declaration class...

    [DllImport("dll_adler32.dll", CallingConvention=CallingConvention.Cdecl)]
    public static extern ulong Source();

    static void Main()
    
          ulong t1;
          t1 = Source(); // returns a random value
    

【问题讨论】:

你有什么问题? 这很奇怪,因为Source() 不接受参数。是否有隐藏在某处的覆盖...? Thomas,我修好了,谢谢。问题是:为什么返回随机数,什么时候必须1。 ulong 在 c# 中是 64 位,在 c 和 c++ 中,除非 typedef 声明为“long long”是 32 位。还要明确你的调用约定。 阿德里亚诺·雷佩蒂,谢谢。这行得通。我把它改成 uInt。 【参考方案1】:

在 C++ 代码中,uLong 是 32 位,而 C# 中的 ulong 是 64 位。所以Source 只会写入 32 位,但 C# 会读取 64 位。十六进制的177005910189670410x3EE298 00000001。低 32 位是 Source 返回的 1 值,高 32 位是 C# 碰巧读取的任何随机数据。将您的 p/Invoke 定义更改为:

[DllImport("dll_adler32.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern uint Source();

【讨论】:

这说明了为什么你应该更喜欢十六进制而不是十进制。一旦你意识到0x3EE298 00000001 不是完全随机的,而是前 32 位是随机的,那么解决方案就很明显了。

以上是关于在C#中使用C/C++库的方法返回一个随机值,而不是上面的返回的主要内容,如果未能解决你的问题,请参考以下文章

使用唯一随机值更新sql表中的所有行,而不使用c#中的主键或唯一键

C# 7.0

按值返回值而不等待所有值返回异步 C#

使用另一个表作为随机值的集合随机更新一组值而不使用循环的方法?

从查询 C#、EF Core 返回一个值

如何使用随机值生成数组,而不使用循环?