Domanda

Come nella domanda Creazione semplice c ++. Involucro rete. Step-by-step

Tring utilizzare le classi C ++ in .NET ma sto avendo problemi di costruzione in Visual Studio (2008).

Ho una classe non gestita A (C ++ compilato con / CLR). Ho creato una classe C ++ / CLR 'Class1' che avvolge A e con la corrispondenza Metodo di delega ai metodi di A.

Se includo file sorgente unità di classe di una nella libreria di classi progetto di Class1 (gestito) non ho problemi collegamenti tutto e funziona bene, Ma ho molte classi C ++ non gestito come A e sto Tring per metterli in una DLL e link che DLL alla libreria gestita (di wrapper di classe). [Io in realtà non vedo la necessità di collegare tra loro di questi DLL, a questo punto, ma le appare compilatore per essere che richiede, dando gli stessi errori riportati di seguito.]

Ho creato / CLR / biblioteca VisualC ++ Classe e ha aggiunto la mia classe C ++ (A elencati di seguito) e costruire. [Ho usato le impostazioni di default, ma nelle impostazioni del linker del progetto Ho provato sia Registro di uscita con sì e no.] Non ci sono stati errori e il file DLL è stato creato.

Ho creato / CLR / biblioteca VisualC ++ Classe e ha creato la classe wrapper 'Class1' Ho usato tutte le impostazioni predefinite. Sotto le proprietà del progetto ho cliccato 'Riferimenti' 'Aggiungi nuovo riferimento" e selezionato la DLL creata nel primo passaggio.

ricevo errori del linker:

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

Gli stessi errori come se mi tolgo A.cpp nel progetto libreria di classe wrapper (l'opzione che le opere). Non capisco il motivo per cui la build sta cercando di risolvere i esterni, in primo luogo perché questa è una libreria, non è un programma.

C'è qualcos'altro che ho bisogno di aggiungere alle proprietà del progetto della libreria classe wrapper o registrare la DLL di classi non gestite o opzioni del compilatore? Ho anche bisogno di un file LIB per andare con la DLL? (Non appare file lib nella directory di progetti di destinazione)

Devo ancora utilizzare __declspec (dllexport) [it pensato che era solo per le funzioni stile C Non i membri della classe.] come nella domanda: esportazione non gestiti classi da un Visual C ++ DLL anche se la libreria non gestito C ++ è compilato con il CLR attivato.

(ho fatto anche provare a compilare come una libreria statica, ma io non riesco a capire come aggiungere il file LIB al progetto libreria di classi CLR).

La mia classe di test è

namespace Z 
{
class A
{
public:

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

con l'attuazione:

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

E la classe wrapper è

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

Come per la domanda: C ++ / CLI Mixed Mode DLL Creazione Ho anche provato:

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

E anche questa spingendo gestito intorno A.cpp.

Aggiornamento: Come per la risposta di mcdave ho rimosso il / CLR questo prodotto una DLL, ora come faccio a fare questa DLL a disposizione del mio test_NET_library?

ho provato Riferimenti / Aggiungi nuovo riferimento, e selezionato il nuovo questa nuova DLL; ed ha ottenuto il messaggio "Impossibile aggiungere riferimento al file 'C: .. \ unmanaged_lib.dll'. perché non è né NET assemblaggio o il controllo ActiveX registrato". La DLL è stato aggiunto alla lista di file del progetto, ma le appare compilatore per essere ignorarlo.

Ho cercato Aggiungi / voce esistente e selezionato la nuova DLL. ma i file DLL non sono un tipo di file selezionabile.

È stato utile?

Soluzione

Con i pochi suggerimenti da l'aggiornamento cercherò due ipotesi ...

  1. Quando unmanaged_lib è un lib collegata in modo statico, hanno impostato il progetto unmanaged_lib di essere una dipendenza di test_NET_library? (Nella finestra Gestione progetti, fare clic destro su test_NET_library, selezionate "Dipendenze progetto ..." e selezionare unmanaged_lib.)
  2. Quando unmanaged_lib è una DLL, è necessario esportare la classe dalla DLL seguendo questa risposta e anche fare il test_NET_library dipendono progetto unmanaged_lib.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top