gpt4 book ai didi

c# - 在 C# 中使用非托管 C++ 代码对所有类型 double 返回 0

转载 作者:行者123 更新时间:2023-11-30 02:29:23 25 4
gpt4 key购买 nike

我正在尝试用 C++ 编写一个简单的计算器 DLL,并在我的 C# GUI 中使用该 DLL。但是,对于 double 类型的任何使用,我总是得到“0”作为我的返回值。这是 C++ 方面:

MathDLL.h

#ifndef MATH_DLL_H
#define MATH_DLL_H

#define MATHMANAGERDLL_API __declspec(dllexport)

extern "C" MATHMANAGERDLL_API double __stdcall Add(double x, double y);

#endif //MATH_DLL_H

MathDLL.cpp

#include "MathDLL.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
#define NULL 0
MathManager* mathManager;

MATHMANAGERDLL_API double __stdcall Add(double x, double y)
{
if (mathManager == NULL)
return false;

return mathManager->add(x, y);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif

数学管理器.h

#ifndef MATH_MANAGER_H
#define MATH_MANAGER_H
class MathManager
{
public:
MathManager();
~MathManager();

double __stdcall add(double x, double y);
};

#endif //MATH_MANAGER_H

数学管理器.cpp

#include "MathManager.h"

MathManager::MathManager()
{

}

MathManager::~MathManager()
{

}

double __stdcall MathManager::add(double x, double y)
{
return x+y;
}

我正在像这样在 C# 中导入 DLL 函数:

SomeWinFormApp.cs

...
// Import Math Calculation Functions (MathDLL.h)
[DllImport("MATH_DLL.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "Add")]
public static extern double Add(double x, double y);

当我调用 Add() 时,我得到的返回值为 0。我什至将 C++ 端编辑为

double __stdcall MathManager::add(double x, double y)
{
return 1.0;
}

但我仍然得到 0。这里可能有什么问题?我之前收到 PInvoke 错误,这就是我更改为 __stdcall 的原因。如果我使用 __cdecl,我仍然会得到 0。

感谢任何帮助。谢谢!

最佳答案

你声明

MathManager* mathManager;

未定义。您很幸运,它实际上是 NULL,因此您的保护代码起作用并返回 false

if (mathManager == NULL) return false;

你可以在没有任何指示的情况下简单地做很多事情:

MathManager mathManager;

MATHMANAGERDLL_API double __stdcall Add(double x, double y)
{
return mathManager.add(x, y);
}

关于c# - 在 C# 中使用非托管 C++ 代码对所有类型 double 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com