C ++:使用dll导出包装非托管dll

时间:2011-08-02 20:21:18

标签: c++ 64-bit wrapper managed

我使用的是针对.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位是不同的但是我不确定这对我的影响。

我一直在寻找一个答案并且做得很短,所以任何建议或建议将不胜感激。

提前致谢

1 个答案:

答案 0 :(得分:2)

此类错误可能归因于Configuration Manager设置。设置x64配置时,配置管理器通常会将依赖的.dll设置为Win32而不是x64。打开解决方案的Configuration Manager,查看每个项目的设置。验证它们是否将构建x64配置并检查它们是否已构建。

另一个有用的检查是调用约定。例如,如果一个项目使用_cdecl而另一个项目使用_stdcall,则项目之间的调用将无法链接。错误消息将显示调用项目正在使用的调用约定。您可以在目标.dll或.lib文件上使用DUMPBIN / EXPORTS来查找正在导出的调用约定。 (DUMPBIN位于VC / bin文件夹中)。