C ++: упаковка неуправляемой DLL с помощью экспорта DLL - PullRequest
2 голосов
/ 03 августа 2011

Я использую Visual Studio 2010 для .Net 4.0

Я работаю с неуправляемой DLL C ++, используя управляемую оболочку C ++.Я использую _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, как описано здесь , я получаю следующую ошибку:

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 Ответ

2 голосов
/ 27 января 2012

Этот тип ошибки, вероятно, связан с настройкой Configuration Manager.Когда вы настраиваете конфигурацию x64, менеджер конфигурации часто устанавливает зависимые .dll для компиляции как Win32 вместо x64.Откройте Configuration Manager для решения, просмотрите параметры для каждого проекта.Убедитесь, что они соберут конфигурацию x64, и что они включены.

Еще одна полезная проверка - соглашение о вызовах.Например, если один проект использует _cdecl, а другой - _stdcall, то вызовы между проектами не смогут связываться.Сообщение об ошибке покажет соглашение о вызовах, которое используется вызывающим проектом.Вы можете использовать DUMPBIN / EXPORTS в целевом .dll или .lib файле, чтобы узнать соглашение о вызовах, которое экспортируется.(DUMPBIN находится в папке VC / bin).

...