我在托管DLL项目中有一个头文件,如下所示:
Enums.h:
#pragma once
...
public ref struct ManagedStruct {
Bitmap^ image;
}
...
此标头既可以从DLL中的另一个类引用,也可以从单独的可执行文件引用。仅托管结构生成:
错误C2011:'ManagedStruct':'class'类型重新定义。
如果我将结构移动到DLL中的主头文件,它可以正常工作,并且可以公开访问,这就是我正在做的事情,但我非常想知道为什么当我移动它时发生这种情况到另一个文件。
我检查了所有必要的包含和名称空间并尝试了明显的标题保护,但无济于事;我仍然得到错误。
非常感谢任何见解!
答案 0 :(得分:31)
在使用托管代码时,您必须对传统的C / C ++头文件进行一些调整。类型声明的主要来源是程序集元数据。这与本机C / C ++编译模型非常不同,在本机C / C ++编译模型中,您拥有以获得对其他模块可见的类型的头文件。
我猜你在EXE项目中得到了这个C2011错误。你们都添加了对DLL项目程序集的引用(就像你应该)和在头文件中使用了#include。就像你不应该。这是一个有保证的重复定义,#pragma曾经不能解决这个问题。
不要将头文件用于导出的类型定义。始终使用装配参考。
答案 1 :(得分:1)
我知道这个问题有点陈旧,但我写这篇文章以备将来使用: 我有以下问题,这是类似的: 托管DLL有一个托管类。 managed.h:
namespace Managed {
ref class CManagedClass {...}
}
在一个unamanged类中我想使用上面的类,所以在unmanaged.h中
#include "managed.h"
在另一个DLL中我也做了:
#include "unmanged.h"
在类型重定义错误中解决了。 我使用以下方法找到了解决此问题的方法: unmanaged.h中的前向声明
namespace Managed {
ref class CManagedClass;
}
并像往常一样将managed.h包含在unmanaged.cpp文件中。