Связывание неуправляемой DLL C ++ с DLL управляемой библиотеки классов C ++

Как в вопросе Создание простой оболочки c ++. Net. Пошагово

Я пытаюсь использовать классы C ++ в .NET но у меня возникают проблемы при сборке в Visual Studio (2008).

У меня неуправляемый класс A (C ++ скомпилирован с / clr). Я создал класс C ++ / clr 'Class1', который обертывает A и соответствует метод делегирует метод A.

Если я включу исходный файл модуля класса A в библиотеку классов проект для Class1 (управляемый) у меня нет проблем все ссылки и работает нормально, Но у меня много неуправляемых классов C ++, таких как A, и я пытаюсь поместить их в DLL и свяжите эту DLL с управляемой библиотекой (оболочек классов). [На самом деле я не вижу необходимости связывать эти DLL вместе на данный момент, но компилятор, похоже, требует этого, что дает те же ошибки, что и ниже.]

Я создал библиотеку VisualC ++ / CLR / Class и добавил мой класс C ++ (A указан ниже) и build. [Я использовал настройки по умолчанию, но в настройках компоновщика проекта я пробовал оба Зарегистрируйте вывод с помощью да и нет.] Ошибок не было, и был создан файл .DLL.

Я создал библиотеку VisualC ++ / CLR / Class и создал класс-оболочку Class1 Я использовал все настройки по умолчанию. В свойствах проекта я щелкнул "Ссылки" "Добавить новую ссылку". и выбрал DLL, созданную на первом шаге.

Я получаю ошибки компоновщика:

test_NET_library.obj : error LNK2028: unresolved token (0A000009) "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2028: unresolved token (0A00000A) "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
C:\temp\test_Cpp_CLI\test_NET_library\Debug\test_NET_library.dll : fatal error LNK1120: 4 unresolved externals

Те же ошибки, что и при удалении A.cpp в проекте библиотеки классов оболочки (вариант, который работает). Я не понимаю, почему сборка вообще пытается решить внешние проблемы потому что это библиотека, а не программа.

Есть ли что-то еще, что мне нужно добавить в свойства проекта библиотеки классов-оболочек или зарегистрировать DLL неуправляемых классов, или параметры компилятора? Нужен ли мне также файл .lib для работы с DLL? (в целевом каталоге проектов нет файла lib)

Мне все еще нужно использовать __declspec (dllexport) [он думал, что это только для функций стиля C не ученики.] как в вопросе: Экспорт неуправляемых классов из Visual C ++ DLL? несмотря на то, что неуправляемая библиотека C ++ скомпилирована с включенной средой CLR.

(Я также пробовал компилировать как статическую библиотеку, но не могу понять, как добавить файл .lib в проект библиотеки классов CLR).

Мой тестовый класс -

namespace Z 
{
class A
{
public:

   int m1(int p1, int p2);
   int m2(int p3, int p4);
};
};

с реализацией:

#include "A.h"
namespace Z 
{
int A::m1(int p1, int p2) { return p1+p2; };
int A::m2(int p3, int p4) { return p3 * p4; };
};

И класс-оболочка

#pragma once
#include "../A.h"
using namespace System;
namespace test_NET_library {
 public ref class Class1
 {
 private: Z::A *a;
 public: Class1()
  : a(new Z::A)
   {}
 public: inline int m1(int p1, int p2)
  {  return a->m1(p1,p2);
  };
 public: inline int m2(int p3, int p4)
  {return a->m2(p3,p4);
  };
 };
}

Согласно вопросу: Смешанный режим C ++ / CLI Создание DLL Я также пробовал:

#pragma managed(push, off) 
#include "../A.h"
#pragma managed(pop)

А также это проталкивание управлялось вокруг A.cpp.

Обновление: В соответствии с ответом mcdave я удалил / clr, что создало DLL, как мне сделать эту DLL доступной для моей test_NET_library?

Я попробовал Ссылки / Добавить новую ссылку и выбрал новую эту новую DLL; и получил сообщение «Не удалось добавить ссылку на файл 'C: .. \ unmanaged_lib.dll', потому что он не является сборкой .NET или зарегистрированным элементом ActiveX». DLL была добавлена ​​в список файлов проекта, но компилятор, похоже, игнорирует ее.

Я попробовал Добавить / существующий элемент и выбрал новую DLL. но файлы .DLL нельзя выбрать.

8
задан Community 23 May 2017 в 12:03
поделиться