2

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

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

但是当我将返回类型更改为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
}

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

更新

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

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

4

1 回答 1

3

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

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

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

所以你的代码正在做你被告知不要做的事情。调用LoadLibrary将成功。随后的调用GetProcAddress将成功。但是您加载的模块不适合执行代码。

于 2013-10-08T10:34:25.213 回答