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

StackOverflow https://stackoverflow.com/questions/4002269

  •  25-09-2019
  •  | 
  •  

Вопрос

Как и в вопросе Создание простой 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 library и добавил свой класс C ++ (приведенный ниже) и build.[Я использовал настройки по умолчанию, но в настройках компоновщика проекта я попробовал оба варианта Зарегистрируйте вывод с помощью yes и no.] Ошибок не было, и файл .DLL был создан.

Я создал библиотеку классов VisualC ++ / CLR / и создал класс-оболочку '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 , а не для членов класса.] как и в вопросе: Экспортировать неуправляемые классы из библиотеки DLL Visual C ++? даже несмотря на то, что неуправляемая библиотека 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);
  };
 };
}

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

#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-файлы не являются выбираемым типом файлов.

Это было полезно?

Решение

Используя несколько подсказок из вашего обновления, я попробую сделать две догадки...

  1. Если unmanaged_lib является статически связанной библиотекой, установили ли вы, что проект unmanaged_lib зависит от test_NET_library?(В окне Project Explorer щелкните правой кнопкой мыши на test_NET_library, выберите "Зависимости проекта..." и выберите unmanaged_lib.)
  2. Если unmanaged_lib является библиотекой DLL, вам необходимо экспортировать класс из библиотеки DLL следующим образом это ответьте, а также сделайте test_NET_library зависящим от проекта unmanaged_lib.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top