Экспорт собственного типа из проекта C ++ / CLI - PullRequest
2 голосов
/ 09 января 2012

Как экспортировать методы нативного класса, определенного в проекте C ++ / CLI?Вот что у меня есть:

.h файл:

#pragma once

#ifdef COMPILE_PRODUCER_LIB
  #define PRODUCER_LIB_EXPORT __declspec(dllexport)
#else
  #define PRODUCER_LIB_EXPORT __declspec(dllimport)
#endif

public class PRODUCER_LIB_EXPORT MySecondNativeClass {
public:
  MySecondNativeClass(int val);

  int getValue() const;

private:
  int m_value;
};

.cpp файл:

#include "stdafx.h"
#include "MySecondNativeClass.h"

MySecondNativeClass::MySecondNativeClass(int val) {
  this->m_value = val;
}

int MySecondNativeClass::getValue() const {
  return this->m_value;
}

Использование этого класса в том же проекте работает нормально, ноиспользование его в другом (C ++ / CLI) проекте дает мне ошибки компоновщика «неразрешенный внешний символ».(COMPILE_PRODUCER_LIB - это определение препроцессора, определенное только в проекте, который содержит класс.)

Я создал небольшое решение (для Visual Studio 2010), которое показывает проблему (загрузить в конце эта страница ).Там собственный класс MySecondNativeClass определен в проекте "ManagedProviderLib" и используется в "ExternalTestClass.cpp" (в проекте "ManagedExternalLib").

1 Ответ

5 голосов
/ 09 января 2012

Ваш проект DLL создает файл .lib в каталоге сборки, библиотеке импорта DLL.Вам необходимо указать этот .lib-файл в другом проекте, параметр Linker + Input, Additional Dependencies.

Обратите внимание, что Add Reference не может работать, метаданные сборки содержат только определения для управляемых классов.Ваш класс - родной C ++, не управляемый.Также убедитесь, что ваш .cpp файл скомпилирован без / clr.Компилятор C ++ / CLI с радостью переведет нативные классы C ++ в IL, но это не очень эффективно.Вы можете управлять этим в файле исходного кода с помощью #pragma managed.

...