我使用的是针对.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为目标时,这一切都很有效,但是当我按照here所述将目标平台更改为x64时,我收到以下错误:
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位是不同的但是我不确定这对我的影响。
我一直在寻找一个答案并且做得很短,所以任何建议或建议将不胜感激。
提前致谢
答案 0 :(得分:2)
此类错误可能归因于Configuration Manager设置。设置x64配置时,配置管理器通常会将依赖的.dll设置为Win32而不是x64。打开解决方案的Configuration Manager,查看每个项目的设置。验证它们是否将构建x64配置并检查它们是否已构建。
另一个有用的检查是调用约定。例如,如果一个项目使用_cdecl
而另一个项目使用_stdcall
,则项目之间的调用将无法链接。错误消息将显示调用项目正在使用的调用约定。您可以在目标.dll或.lib文件上使用DUMPBIN / EXPORTS来查找正在导出的调用约定。 (DUMPBIN位于VC / bin文件夹中)。