2011-12-13 22 views
7

Tengo un proyecto de C++ (visual studio 2010) que consta de código nativo y código C++/cli también. No puedo compilar todo el proyecto con/clr, así que lo hago para los respectivos archivos C++/cli. Mi problema es que un archivo de encabezado no se puede compilar con/clr, pero quiero hacer que algunas funciones de C++/cli sean reutilizables dentro del proyecto completo y definir los prototipos de métodos en un archivo de encabezado para incluirlo en cada archivo donde lo necesite. ¿Hay una solución? He intentado definir algunos prototipos de métodos de código mixto en un archivo de cabecera, pero/clr debe estar activado para que se pueda compilar.archivo de encabezado de interfaz C++/cli

Aquí está mi ejemplo:

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 se queja con errores en Test.h como C++/CLI debe estar habilitado para usa #using. Pero creo que esto es insignificante y compilaría de todos modos.

Compilación aborta con un error de vinculador (SRY, tengo alemana Versión 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). 

que definitivamente no tiene una clase duplicado "de prueba" en otro lugar, así que no sé donde el duplicado viene. ¿Qué son las informaciones de tipo de letra y por qué no son consistentes?

+0

¿Cómo se puede compilar parte del proyecto con/clr y parte sin? ¿Y por qué su código nativo no funciona con/clr? – svick

+1

Es un complemento para 3dsMax y la compilación de todo el proyecto con/clr no funciona, tuve muchos errores. La forma recomendada por Autodesk es compilar solo las partes del código C++/cli con/clr on. Para cada archivo .cpp puede establecer "Usar Common Language Runtime" en las propiedades. – Michbeckable

+0

¿Podría publicar un ejemplo sucinto de un archivo de encabezado y usar un archivo cpp que no compilaría? Además, ¿el archivo de cabecera está siendo consumido por a/clr cpp y un cpp no ​​/ clr? –

Respuesta

3

Creo que todo lo que has perdido el punto.

Puede compilar fácilmente un proyecto nativo con algunas clases/clr. (Por ejemplo: una DLL nativa seguirá funcionando como una DLL nativa, sin embargo, también se puede cargar en C#, y sus clases compiladas/clr se pueden acceder en C#.)

Es por eso que existe esta opción en el nivel de archivo (Clic derecho .cpp: Properties-> C \ C++ -> Common Language Runtime Support-/CLR)

El problema es:

La comunicación entre los nativos clases \ administrados, ya que los archivos .H no se pueden configurar para utilizar/clr, no se pueden usar para hacer referencia a una clase administrada en otro lugar, incluidos otros archivos/clr dentro del mismo proyecto. (es decir, puede crear archivos/clr, pero no pueden comunicarse entre sí, ni puede hacer referencia a ellos en partes nativas del proyecto.)

La mejor solución que puedo encontrar es crear un "pegamento" "C# .dll archivo.

Cree una nueva biblioteca de clases C#, agregue la DLL nativa como referencia y luego compile.

Ahora, en su proyecto original, puede cargar la DLL C# y acceder a las cosas nativas/clr a través de ella. (El código administrado que hace referencia de esta manera se puede usar con código nativo \ administrado.)

Es muy posible, pero no puedo encontrar una forma directa de lograr esto.

De eso trata el tema, parece que no hay forma de hacer referencia a las clases/clr debido a que los archivos de encabezado no funcionan cuando configura/clr en el nivel de archivo. (es decir, un encabezado no puede contener el código/clr a menos que el proyecto WHOLE esté establecido en/clr)

Debe haber una forma de referencia/clr cosas sin encabezados, o C++ \ CLI simplemente se rompe, puedo cargar fácilmente código nativo en archivos/clr mediante el uso de pragma + encabezados, sin embargo, el revés parece imposible antes de mi solución de "pegamento".

De eso creo que se trata este tema.


Mi método funciona, pero, es muy difícil de hacerlo bien, y la compilación es un dolor debido a las dependencias circulares, etc ,.

Realmente espero que existe una forma correcta de hacer esto, yo he estado buscando, y mi búsqueda me llevó aquí ...

La verdadera solución, sería hacer .h archivos de soporte/CLR, entonces podría definir su clase administrada en el encabezado, y poder hacer referencia a ella libremente utilizando métodos estándar, como include \ using \ pragma, etc.

Cuestiones relacionadas