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

标签 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 为目标时,这一切都很好,但是当我按照描述将目标平台更改为 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/

相关文章:

c++ - std::unordered_map::merge() 的安全性

C++ cout 腐败

c++ - std::strftime 的返回值

c++ - c++ 中有 64 位 int 这样的东西吗?

c++ - 高效检查数百个可能后缀之一的字符串

sql - 如何使用 ODBC 连接到 64 位 SQL Server?

c++ - 是否可以分析查看程序集的 C/C++ 内联函数?

c - 如何导入用c或shell编写的包并在python中使用

c - 包含引用本地 C 库的本地 Perl 模块

delphi - WinHttp Delphi 包装器