平调用返回浮点数
pinvoke return a float
已经为此工作了几个小时,无法让它工作:(
下面的代码给出异常"试图读取或写入受保护的内存。这通常表明其他内存已损坏。这是固定的,请参阅下面的更新
但是当我将返回类型更改为 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.exe
。LoadLibrary
的文档说:
LoadLibrary
也可用于加载其他可执行模块。例如,该函数可以指定一个.exe文件,以获取可在FindResource
或LoadResource
中使用的句柄。但是,不要使用LoadLibrary
来运行.exe文件。请改用CreateProcess
函数。
因此,您的代码正在执行您被告知不要做的事情。对LoadLibrary
的调用将成功。后续对GetProcAddress
的调用将成功。但是您加载的模块不适合执行代码。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 返回浮点数的小数位数
- 从函数c++返回浮点数组
- atof() 返回浮点数而不是双精度
- 为什么我的函数不返回浮点数?
- 如何创建用于存储和返回浮点数数组的结构
- 为什么我的函数返回一个整数,尽管我已经将答案指定为浮点数
- 为什么 boost::geometry::d istance 使用 model::d 2::p oint_xy<float> 返回双精度而不是浮点数?
- 如何保存返回的浮点数组指针
- 从函数返回浮点数组
- 如何模板化函数以返回浮点数、整数或结构的向量
- 平调用返回浮点数
- 当浮点数小于1时,函数返回0
- 将c++中的浮点数数组返回给Python
- c++在函数返回中截断浮点数
- 返回c++中的浮点数数组