2010-06-04 81 views
14

我在託管DLL項目頭文件像這樣:C++/CLI:公共參考文獻結構生成C2011: '類' 類型重新定義

Enums.h:

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

這個頭部被引用都來自DLL中的另一個類以及一個單獨的可執行文件。單獨的託管結構正在生成:

錯誤C2011:'ManagedStruct':'class'type refinition。

如果我提出的結構在它工作正常,並且是可公開訪問的DLL的主頭文件,所以這是我在做什麼,但我非常想了解爲什麼這是當我發生把它移動到另一個文件。

我已經檢查過所有必要的包含和命名空間,並嘗試了明顯的標頭衛士,但無濟於事;我仍然得到錯誤。

非常感謝任何見解!

回答

29

當您使用託管代碼時,您必須調整傳統的C/C++頭文件。類型聲明的主要來源是程序集元數據。這與本機C/C++編譯模型非常不同,您的擁有的頭文件,以便您可以使其他模塊可見的類型的頭文件。

我想猜你會在EXE項目中得到這個C2011錯誤。你在哪裏添加了對DLL項目組件的引用(如你應該)在頭文件中使用了#include。就像你不應該那樣。這是一個有保證的重複定義,#pragma曾經不能解決這個問題。

請勿將頭文件用於導出的類型定義。始終使用裝配參考。

+0

你是對的 - 感謝您的信息!就在我以爲我得到了C++/CLI的竅門...... – T3db0t 2010-06-06 16:09:54

1

我知道這個問題有點老,但我正在寫這個以備將來使用: 我遇到了以下類似的問題: 託管的DLL有一個託管類。 managed.h:

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

在unamanged類,我想在另一個DLL我也沒有使用這個上面的類,因此在unmanaged.h

#include "managed.h" 

#include "unmanged.h" 

這解決了類型重定義錯誤。 我已經找到了解決方案,使用下面的方法這個問題:在unmanaged.h

namespace Managed { 
    ref class CManagedClass; 
} 

向前聲明,包括在unmanaged.cpp文件照常managed.h。

+0

我有一個類似的問題,但我希望我的unmanaged.h中的方法被內聯和模板。因此,我無法使用您的解決方案進行前向聲明和cpp文件。我必須在unmanged.h中有完整的實現。 我通過封裝的#include 「managed.h」 與#ifdef來解決我的問題: 的#ifdef FIRST_DLL_EXPORT 的#include 「managed.h」 #ENDIF ..和只在第1個DLL FIRST_DLL_EXPORT設置,例如#include「managed.h」將被其他包含'「unmanged.h」的dll忽略。 – 2015-01-16 14:57:44