在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 位。十六进制的17700591018967041
是0x3EE298 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#中的主键或唯一键