【发布时间】:2020-12-10 15:57:32
【问题描述】:
我正在尝试学习如何制作 C++ DLL,所以我很容易错过一些超级基本的东西。
我目前正在用 C++ 创建一个 DLL,然后将其加载到用 C# 编写的测试环境中
测试环境使用 C#,因为我发现 Windows 窗体最适合构建原型 GUI。
我的 DLL (C++) 中有一个定义
#define BUILD_FOR_TESTBED
以及我为查找它是否已定义而创建的函数
//header file
extern "C" _declspec(dllexport) extern bool WasBuiltForTestbed();
//source file
bool WasBuiltForTestbed()
{
#ifdef BUILD_FOR_TESTBED
return true;
#endif // BUILD_FOR_TESTBED
#ifndef BUILD_FOR_TESTBED
return false;
#endif // BUILD_FOR_TESTBED//
}
然后我在测试环境(C#)中加载函数
[DllImport(LIBRARY_PATH, CharSet = CharSet.Unicode)]
public static extern bool WasBuiltForTestbed();
并在测试环境中写入控制台
Console.WriteLine("Built For Testbed: " + WasBuiltForTestbed());
无论我做什么,一旦加载到测试环境中,WasBuiltForTestbed() 就会返回 true。
问:我的问题是,我在这里缺少什么使函数始终返回 true?无论是否定义了 BUILD_FOR_TESTBED,如何让函数返回?
到目前为止我尝试过的测试:
“短路”函数并使其直接“返回”真或假。它仍然只返回 true。
bool WasBuiltForTestbed() { return false; }
清理库 (C++) 和测试环境 (C#) 构建。然后重建
在库中将函数 WasBuiltForTestbed() 的名称更改为 WasBuiltForrTestbed()。测试环境未能加载函数,所以它肯定会找到它认为是函数的东西并对其进行评估。
感谢任何帮助。
【问题讨论】:
-
在 c# 中,只要数字不为零,您就会得到 true。因此,由于某种原因,在 c++ 中设置的零在 c# 中不是零。当 c++ 和 c# 之间的变量大小不同时,通常会发生这种情况。所以尝试: ((int)WasBuiltForTestbed()).ToString() 看看返回了什么数字。