2010-06-04 7 views
14

Tengo un archivo de cabecera en un proyecto DLL administrada de esta manera:C++/CLI: struct ref pública genera C2011: Tipo de 'clase' redefinición

Enums.h:

#pragma once 
... 
public ref struct ManagedStruct { 
    Bitmap^ image; 
} 
... 

se hace referencia a esta cabecera ambos de otra clase en el DLL y de un ejecutable separado. La estructura administrada solo está generando:

error C2011: 'ManagedStruct': redefinición de tipo 'clase'.

Si muevo la estructura al archivo de encabezado principal en la DLL funciona bien, y es públicamente accesible, así que eso es lo que estoy haciendo, pero me gustaría mucho aprender por qué sucede esto cuando solo muévelo a otro archivo.

He comprobado todas las inclusiones y espacios de nombres necesarios Y he intentado con las protecciones de encabezado obvias, sin éxito; Aún tengo el error.

¡Muchas gracias por cualquier idea!

Respuesta

29

Tienes que sintonizar el archivo de encabezado C/C++ tradicional, piensa un poco cuando trabajas con código administrado. La fuente principal de declaraciones de tipo es el conjunto de metadatos. Esto es muy diferente del modelo de compilación C/C++ nativo donde tiene para tener un archivo de encabezado para los tipos que hace visibles a otros módulos.

Voy a adivinar que obtendrá este error C2011 en el proyecto EXE. Donde ambos agregaron una referencia al ensamblado del proyecto DLL (como debería) y se usa #include en el archivo de encabezado. Como no deberías Esa es una definición duplicada garantizada, #pragma una vez no soluciona eso.

No utilice archivos de encabezado para las definiciones de tipos exportados. Siempre use referencias de ensamblaje.

+0

Tiene razón, ¡gracias por la información! Justo cuando pensaba que estaba tomando el control de C++/CLI ... – T3db0t

1

Sé que esta pregunta es un poco antigua, pero estoy escribiendo esto para uso futuro: Tuve el siguiente problema, que era similar: administrado DLL tenía una clase administrada. managed.h:

namespace Managed {  
     ref class CManagedClass {...} 
    } 

en una clase de unamanged quería utilizar esta clase por encima de lo que en unmanaged.h

#include "managed.h" 

en otro DLL También hice:

#include "unmanged.h" 

que se resolvió en el error de redefinición de tipo. Me han encontrado una solución a este problema utilizando el método siguiente: declaración adelantada en el unmanaged.h

namespace Managed { 
    ref class CManagedClass; 
} 

e incluir el managed.h en el archivo unmanaged.cpp como de costumbre.

+0

Tuve un problema similar, pero quería que los métodos en mi no administrado.h fueran en línea y plantillas. Por lo tanto, no pude usar su solución con la declaración directa y un archivo cpp. Tenía que tener la implementación completa en mi no administrado.h. he resuelto mi problema encapsulando # include "managed.h" con un #ifdef: #ifdef FIRST_DLL_EXPORT # include "managed.h" #endif ..y conjunto FIRST_DLL_EXPORT sólo en el primer DLL, tales ese #include "managed.h" sería ignorado por cualquier otro dll que incluyera "unmanged.h". –

Cuestiones relacionadas