我正在使用面向 .Net 4.0 的 Visual Studio 2010
我正在使用托管 C++ 包装器处理非托管 C++ dll。我正在使用 _declspec(dllexport) 导出非托管 .dll 下面是非托管 dll 的头文件:
class DllExport KeyManager
{
public:
KeyManager(const char *pszKeyFileName, int thisProduct);
~KeyManager();
...
然后我从此处的托管包装器调用非托管 dll:
#include "stdafx.h"
#include "KeyModCLR.h"
#using <mscorlib.dll>
#include <msclr/marshal.h>
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace msclr::interop;
MCKeyManager::MCKeyManager(String ^fileName, int thisProduct)
{
pszFileName = (char*)Marshal::StringToHGlobalAnsi(fileName).ToPointer();
m_pC = new KeyManager(pszFileName, thisProduct);
}
当项目以 Win32 为目标时,这一切都很好,但是当我按照描述将目标平台更改为 x64 时 here我收到以下错误:
Error 17 error LNK2019: unresolved external symbol "public: __cdecl
KeyManager::KeyManager (char const *,int)" (??0KeyManager@@$$FQEAA@PEBDH@Z) referenced in
function "public: __clrcall MCKeyManager::MCKeyManager(class System::String ^,int)" (?? 0MCKeyManager@@$$FQE$AAM@PE$AAVString@System@@H@Z)
我不是很熟悉 C++,因为我没有编写这段代码,所以我不知道我是否遗漏了一些明显的东西。我读过导入函数的修饰对于 64 位和 32 位是不同的,但我不确定这对我有何影响。
我一整天都在寻找答案,但没有找到答案,因此我们将不胜感激任何建议或建议。
提前致谢
最佳答案
此类错误可能是由配置管理器设置引起的。当您设置 x64 配置时,配置管理器通常会将相关的 .dll 设置为编译为 Win32 而不是 x64。打开解决方案的配置管理器,查看每个项目的设置。确认他们将构建一个 x64 配置并且他们被选中以进行构建。
另一个有用的检查是调用约定。例如,如果一个项目使用 _cdecl
而另一个项目使用 _stdcall
,则项目之间的调用将无法链接。错误消息将显示调用项目正在使用的调用约定。您可以在目标 .dll 或 .lib 文件上使用 DUMPBIN/EXPORTS 来找出正在导出的调用约定。 (DUMPBIN 在 VC/bin 文件夹中)。
关于C++:使用 dll 导出包装非托管 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918085/