Verknüpfen von nicht verwalteten C ++ DLL mit Managed C ++ Klassenbibliothek DLL

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

  •  25-09-2019
  •  | 
  •  

Frage

Wie in der Frage Erstellen ++. Net-Wrapper. Schritt-für-Schritt

Ich bin Tring C ++ Klassen in .NET zu verwenden, aber ich habe Probleme Aufbau in Visual Studio mit (2008).

Ich habe eine nicht verwaltete Klasse A (C ++ kompiliert mit / clr). Ich habe eine C ++ / clr Klasse ‚klasse1‘, die A-Packungen und mit passendem Verfahren Delegierten A Methoden.

Wenn ich gehören der Klasse A des Unit-Quelldatei in der Klassenbibliothek Projekt für Class1 (verwaltet) Ich habe keine Probleme alle Link und funktioniert gut, Aber ich habe viele nicht verwaltete C ++ Klassen wie A und ich bin Tring sie setzen in eine DLL und Link, dass DLL auf die verwaltete Bibliothek (von Klassenwrapper). [Ich sehe eigentlich keine Notwendigkeit, diese DLL zusammen an dieser Stelle zu verbinden, aber der Compiler scheint es zu sein, erfordert, so dass die gleichen Fehler unten.]

habe ich VisualC ++ / CLR / Klassenbibliothek und fügte hinzu, meine C ++ Klasse (A unten aufgeführt) und zu bauen. [I die Standardeinstellungen verwendet, aber sowohl in dem Projekt Linker-Einstellungen habe ich versucht, Registrieren Ausgang mit ja und nein.] Es gab keine Fehler und die DLL-Datei erstellt wurde.

habe ich VisualC ++ / CLR / Klassenbibliothek und erstellt die Wrapper-Klasse ‚Class1‘ Früher habe ich alle Standardeinstellungen. Unter Projekteigenschaften klickte ich ‚Referenzen‘ ‚New Reference“ und wählte die DLL im ersten Schritt erstellt hat.

Ich erhalte Linkerfehler:

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

Die gleichen Fehler, als ob ich A.cpp in dem Wrapper-Klasse Bibliothek-Projekt (die Option, das funktioniert) entfernen. Ich verstehe nicht, warum der Build zu lösen Externen in erster Linie versucht, denn dies ist eine Bibliothek, kein Programm.

Gibt es etwas anderes muß ich die Wrapper-Klassenbibliothek Projekteigenschaften hinzufügen oder die DLL von nicht verwalteten Klassen registrieren oder Compiler-Optionen? Brauche ich auch eine LIB-Datei mit dem DLL zu gehen? (Keine Lib-Datei erscheint in dem Projektzielverzeichnis)

Muss ich noch __declspec (dllexport) [angenommen, dass nur für C-Stil-Funktionen war nicht Klassenmitglieder.] wie in der Frage: Export Unmanaged Klassen aus einer Visual C ++ DLL obwohl das nicht verwaltete C ++ Bibliothek mit CLR kompiliert wird aktiviert.

(ich habe versucht, auch als statische Bibliothek kompilieren, aber ich kann nicht herausfinden, wie man hinzufügen die LIB-Datei in das CLR-Klassenbibliothek-Projekt).

Meine Testklasse ist

namespace Z 
{
class A
{
public:

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

mit der Umsetzung:

#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; };
};

Und die Wrapper-Klasse ist

#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);
  };
 };
}

Wie pro die Frage: C ++ / CLI gemischten Modus DLL Creation Ich habe auch versucht:

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

Und auch um A.cpp verwaltet diese drückt.

Update: Wie pro mcdave Antwort entfernte ich die / clr dies produzierte eine DLL, jetzt, wie kann ich diese DLL zur Verfügung zu meinem test_NET_library?

Ich habe versucht, Referenzen / New Reference, und die neue dieses neue DLL ausgewählt; und bekam die Meldung „Es konnte keine Bezugnahme auf Datei‚C: .. \ unmanaged_lib.dll‘hinzuzufügen., weil es weder .NET-Assembly ist oder registriert ActiveX-Steuerelement“. Die DLL wurde in der Projektdateiliste hinzugefügt, aber der Compiler scheint es ignoriert zu werden.

Ich habe versucht, Hinzufügen / Bestehende Element und die neue DLL ausgewählt. aber DLL-Dateien sind kein wählbarer Dateityp.

War es hilfreich?

Lösung

Mit den paar Hinweise von Ihrem Update werde ich zwei Vermutungen versuchen ...

  1. Wenn unmanaged_lib eine statisch gelinkte lib ist, haben Sie das unmanaged_lib Projekt eine Abhängigkeit von test_NET_library zu sein? (In dem Projektfenster Explorer mit der rechten Maustaste auf test_NET_library, wählen Sie "Projektabhängigkeiten ..." und wählen unmanaged_lib.)
  2. Wenn unmanaged_lib eine DLL ist, müssen Sie mit dem folgenden diese Antwort und macht auch die test_NET_library hängen von dem unmanaged_lib Projekt.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top