2010-10-23 13 views
8

Come per la questione Creating simple c++.net wrapper. Step-by-stepcollegamento non gestito DLL C++ con gestito classe C++ libreria DLL

Tring utilizzare le classi C++ .NET in 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 include A e i delegati del metodo corrispondenti ai metodi di A.

Se includo file sorgente unità di classe di A nella libreria di classi progetto di Class1 (gestito) non ho problemi legami tutto e funziona bene, Ma ho molte classi C++ non gestito come A e sto Tring per mettere loro in una DLL e collegano quella DLL alla libreria gestita (dei wrapper di classe). [Io in realtà non vedo la necessità di collegare questi DLL di insieme, a questo punto, ma il compilatore sembra essere che richiede, dando gli stessi errori indicati di seguito.]

ho creato VisualC++/CLR/Class Library e aggiunta la mia classe C++ (A elencata sotto) e build. [Ho usato le impostazioni predefinite ma nelle impostazioni del linker del progetto Ho provato sia Registrare l'output con sì e no.] Non c'erano errori e il file .DLL è stato creato.

Ho creato la libreria VisualC++/CLR/Classe e ho creato la classe wrapper 'Classe1' Ho utilizzato tutte le impostazioni predefinite. Sotto le proprietà del progetto ho cliccato 'Riferimenti' 'Aggiungi nuovo riferimento" e seleziona la DLL creata nella prima fase

ricevo errori del linker:.

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

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

c'è qualcosa altrimenti ho bisogno di aggiungere al wrapp Proprietà del progetto di libreria di classe o registrare la DLL di classi non gestite o opzioni del compilatore? Ho anche bisogno di un file .lib per andare con la DLL? (Nessun file lib appare nella directory di destinazione progetti)

Devo ancora utilizzare __declspec (dllexport) [it pensato che era solo per le funzioni stile C non membri della classe.] come nella domanda: Export Unmanaged Classes from a Visual C++ DLL? anche sebbene la libreria C++ non gestita sia compilata con CLR abilitato.

(Ho anche provato la compilazione come libreria statica, ma 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 Creation Ho anche provato:

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

E anche questa spinta gestita intorno a A.cpp.

Aggiornamento: In base alla risposta di mcdave ho rimosso il file/clr che ha prodotto una DLL, ora come faccio a rendere disponibile questa DLL alla mia test_NET_library?

Ho provato Riferimenti/Aggiungi nuovo riferimento e selezionato la nuova questa nuova DLL; e ha ricevuto il messaggio "Impossibile aggiungere il riferimento al file 'C: .. \ unmanaged_lib.dll' perché non è né un assembly .NET né un controllo ActiveX registrato.". La DLL è stata aggiunta all'elenco dei file del progetto, ma il compilatore sembra ignorarlo.

Ho provato l'elemento Aggiungi/esistente e selezionato la nuova DLL. ma i file DLL non sono un tipo di file selezionabile.

+0

Provare a rimuovere/clr dalla DLL di classe A (il che significa renderlo un 'win32 dll' normale) e se questo non funziona aggiorna la domanda. – mcdave

+0

@mcdave: Ho fatto questo, ma poi non so come rendere test_NET_libary 'consapevole di' o 'link a' questo unmanaged_lib.DLL contenente A (vedere la mia modifica sopra). È lo stesso problema che ho provato a usare unmanaged_lib come un .lib collegato staticamente. –

risposta

6

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

  1. Quando unmanaged_lib è un lib collegata in modo statico, hai impostato il progetto unmanaged_lib di essere una dipendenza di test_NET_library? (Nella finestra Gestione progetti, fare clic con il tasto destro su test_NET_library, selezionare "Dipendenze progetto ..." e selezionare unmanaged_lib.)
  2. Quando unmanaged_lib è una DLL, è necessario esportare la classe dalla DLL seguendo la risposta this e anche fare in modo che test_NET_library dipenda dal progetto unmanaged_lib.
+0

Soluzione 1 ha funzionato (normalmente utilizzo Embarcadero C++ Builder, lì semplicemente si aggiunge il file .lib compilato al progetto, non è nemmeno necessario avere tutti i progetti di libreria statici nel gruppo di progetto (soluzione), né necessario per dipendenze di installazione). –

Problemi correlati