平调用返回浮点数

pinvoke return a float

本文关键字:浮点数 返回 调用      更新时间:2023-10-16

已经为此工作了几个小时,无法让它工作:(

下面的代码给出异常"试图读取或写入受保护的内存。这通常表明其他内存已损坏。这是固定的,请参阅下面的更新

但是当我将返回类型更改为 int 并返回一个 int 值时,它可以工作。 如何使其返回浮值? 谢谢。

VS2012

C++ 代码

extern "C"  __declspec(dllexport)
float compute_similarity()
{       
    return 1.01;
}

C# 代码

[DllImport("demo.exe", EntryPoint = "compute_similarity", CallingConvention =  CallingConvention.Cdecl)]
public static extern float compute_similarity();
public void Get()
{
  float x = compute_similarity(); // here returns random value
}

====

===================================

更新

请参阅下面大卫的评论,问题是 c# 项目面向 x64,而 c++ 面向 Win32。将 c# 项目更改为面向 x86 后,异常消失了。

但是,来自 c# 的调用返回一些随机值,而不是预期的 1.01

我认为

您的问题是您的函数是在可执行文件而不是 DLL 中声明的。将本机代码转换为库项目并编译 DLL。

您的代码将导致调用 LoadLibrary 将文件名传递demo.exeLoadLibrary的文档说:

LoadLibrary也可用于加载其他可执行模块。例如,该函数可以指定一个.exe文件,以获取可在 FindResourceLoadResource 中使用的句柄。但是,不要使用 LoadLibrary 来运行.exe文件。请改用CreateProcess函数。

因此,您的代码正在执行您被告知不要做的事情。对LoadLibrary的调用将成功。后续对GetProcAddress的调用将成功。但是您加载的模块不适合执行代码。