2011-12-13 18 views
7

Ho un progetto C++ (visual studio 2010) che comprende anche codice nativo e codice C++/cli. Non riesco a compilare l'intero progetto con/clr, quindi lo faccio solo per i rispettivi file C++/cli. Il mio problema è che un file di intestazione non può essere compilato con/clr, ma voglio rendere alcune funzioni C++/cli riutilizzabili all'interno dell'intero progetto e quindi definire i prototipi di metodo in un file di intestazione per includerlo in ogni file in cui ho bisogno. C'è una soluzione? Ho provato a definire alcuni prototipi di metodi a codice misto in un file di intestazione, ma/clr deve essere acceso per poterlo compilare.file di intestazione dell'interfaccia C++/cli

Ecco il mio esempio:

Test.h

#include <Windows.h> 
#include <vector> 
#include <string> 

using std::vector; 
using std::string; 

#include <msclr/marshal.h> 

#pragma managed 

using namespace msclr::interop; 
using namespace System; 
using namespace System::IO; 
using namespace System::Runtime::InteropServices; 

public ref class Test 
{ 
public: 
    int Foo(); 
}; 

Test.cpp

#include "Test.h" 

int Test::Foo() 
{ 
    return 4; 
} 

Intellisense si lamenta di errori in Test.h come C++/CLI deve essere abilitato per usa #using. Ma penso che sia trascurabile e si compilerebbe comunque.

compilazione si interrompe con un errore di linker (SRY, ho tedesco versione VS)

Fehler 6 error LNK1255: Fehler bei Verknüpfung aufgrund von Metadatenfehlern.  
Fehler 4 error LNK2022: Fehler bei Metadatenoperation (8013118D) : Duplizierte Typen (_PROPSHEETPAGEA) wurden gefunden, aber die Typenlayoutinformationen sind nicht konsistent: (0x02000198). 
Fehler 5 error LNK2022: Fehler bei Metadatenoperation (8013118D) : Duplizierte Typen (_PROPSHEETPAGEW) wurden gefunden, aber die Typenlayoutinformationen sind nicht konsistent: (0x020001d1). 

io non sicuramente avere una classe duplicato "Test" altrove, quindi non so dove il duplicato viene. Che cosa sono le informazioni di tipelayout e perché non sono coerenti?

+0

Come è possibile compilare parte del progetto con/clr e parte senza? E perché il tuo codice nativo non funziona con/clr? – svick

+1

È un plugin per 3dsMax e la compilazione dell'intero progetto con/clr non funziona, ho ricevuto molti errori. Il metodo consigliato da Autodesk è di compilare solo le parti di codice C++/cli con/clr on. Per ogni file .cpp è possibile impostare "Usa Common Language Runtime" nelle proprietà. – Michbeckable

+0

Potresti pubblicare un breve esempio di un file di intestazione e usare il file cpp che non verrebbe compilato? Inoltre, il file di intestazione viene utilizzato sia da a/clr cpp sia da un non-/ clr cpp? –

risposta

3

Credo che tu abbia tutto perso il punto.

È possibile compilare facilmente un progetto nativo con alcune classi/clr. (Ad esempio: Una DLL nativa funzionerà comunque come una DLL nativa, tuttavia, può anche essere caricata in C#, ed è possibile accedere alle classi compilate/clr in C#.)

Ecco perché esiste un'opzione a il livello del file. (Clic destro cpp: Proprietà-> C \ C++ -> Common Language Runtime Support-/CLR)

Il problema è:

Comunicare tra classi native \ gestiti, poiché i file .H non possono essere impostati per utilizzare/clr, quelli non possono essere utilizzati per fare riferimento a una classe gestita altrove, inclusi altri file/clr all'interno dello stesso progetto. (cioè, puoi creare/clr file, ma, non possono parlarsi, né puoi riferirli all'interno di parti native del progetto.)

La soluzione migliore che posso trovare è creare una "colla" "File C# .dll.

Creare una nuova libreria di classi C#, aggiungere la DLL nativa come riferimento, quindi compilare.

Ora, nel progetto nativo, è possibile caricare la DLL C# e accedere al materiale natives/clr. (Il codice gestito che si fa riferimento in questo modo può essere utilizzato con codice nativo \ gestito.)

È molto possibile, ma non riesco a trovare un modo semplice per raggiungere questo obiettivo.

Ecco di cosa tratta l'argomento, non sembra esserci alcun modo per fare riferimento alle classi/clr a causa di file di intestazione non funzionanti quando si imposta/clr a livello di file. (cioè, un'intestazione non può contenere/clr codice a meno che il progetto WHOLE sia impostato su/clr.)

Ci deve essere un modo per fare riferimento/clr roba senza intestazioni, o C++ \ CLI è solo rotto, posso facilmente caricare codice nativo in file/clr usando le intestazioni pragma +, tuttavia, il contrario sembra impossibile a meno della mia soluzione "colla".

Questo è ciò su cui credo questo argomento.


mio metodo funziona, ma, è molto difficile da ottenere, e la compilazione è un dolore a causa di dipendenze circolari, ecc ,.

Spero davvero che ci sia un modo corretto di fare questo, ho cercato, e la mia ricerca mi ha portato qui ...

La vera soluzione, potrebbe essere quella di rendere i file .h supportare/CLR, quindi potresti definire la tua classe gestita nell'intestazione, ed essere in grado di fare riferimento liberamente usando metodi standard, come include \ using \ pragma, ecc.

Problemi correlati