C ++ / CLI:公共ref结构生成C2011:'class'types的重定义

我有一个托pipeDLL项目中的头文件,如下所示:

Enums.h:

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

这个头文件是从DLL中的另一个类和一个单独的可执行文件中引用的。 单独的托pipe结构正在生成:

错误C2011:'ManagedStruct':'类'types重新定义。

如果我将结构移动到DLL中的主头文件中,它可以正常工作,并且可以公开访问,所以这就是我正在做的事情,但是我非常想知道为什么当我将它移动到另一个文件时。

我已经检查了所有必要的包含和命名空间,并尝试了明显的头卫兵,无济于事; 我仍然得到错误。

非常感谢任何见解!

当您使用托管代码时,您不得不调整传统的C / C ++头文件。 类型声明的主要来源是程序集元数据。 这与原生C / C ++编译模型很大不同,您必须为其他模块可见的类型创建头文件。

我会猜测你在EXE项目中得到这个C2011错误。 你在哪里添加了对DLL项目程序集的引用(就像你应该这样做), 在头文件中使用了#include。 就像你不应该。 这是一个有保证的重复定义,#pragma一旦不能解决这个问题。

不要为导出的类型定义使用头文件。 始终使用装配参考。

我知道这个问题是有点老,但我写这个为将来的使用:我有以下问题,这是类似的:托管DLL有一个托管类。 managed.h:

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

在unamanged类中,我想使用这个上面的类,所以在unmanaged.h

 #include "managed.h" 

在另一个DLL中,我也做了:

 #include "unmanged.h" 

解决了类型重定义错误。 我已经找到了解决这个问题的方法如下:unmanaged.h中的forward声明

 namespace Managed { ref class CManagedClass; } 

并像往常一样在unmanaged.cpp文件中包含managed.h文件。