使用afxwinforms.h使用C ++ / CLI DLL作为另一个C ++ / CLI DLL的引用,也使用afxwinforms.h

时间:2013-04-05 06:41:15

标签: dll mfc c++-cli

在Visual C ++ 2010中,我将C ++ / CLI DLL( ControlWrapper.dll )中的引用添加到另一个C ++ / CLI DLL( CliLibrary.dll )。

两者都包括stdafx.h中的afxwinforms.h。

当我尝试编译时,我得到了这些错误:

error C2011: 'Microsoft::VisualC::MFC::CWin32Window' : 'class' type redefinition
error C2011: 'Microsoft::VisualC::MFC::CWinFormsEventsHelper' : 'class' type redefinition

如果我打开Option 参考装配输出并将#using "CliLibrary.dll"添加到使用.cpp文件,我会收到以下警告:

1>ControlWrapper.dll : warning C4944: 'CWin32Window' : cannot import symbol from 'c:\dev\trunk\CliLibrary.dll': as 'Microsoft::VisualC::MFC::CWin32Window' already exists in the current scope
1>     C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxwinforms.h(83) : see declaration of 'Microsoft::VisualC::MFC::CWin32Window'
1>          This diagnostic occurred while importing type 'Microsoft.VisualC.MFC.CWin32Window' from assembly 'CliLibrary, Version=1.0.4843.17337, Culture=neutral, PublicKeyToken=null'.
1>ControlWrapper.dll : warning C4944: 'CWinFormsEventsHelper' : cannot import symbol from 'c:\dev\sfirm\trunk\sfclrlib\debug\sfclrlib.dll': as 'Microsoft::VisualC::MFC::CWinFormsEventsHelper' already exists in the current scope
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxwinforms.h(122) : see declaration of 'Microsoft::VisualC::MFC::CWinFormsEventsHelper'
1>          This diagnostic occurred while importing type 'Microsoft.VisualC.MFC.CWinFormsEventsHelper' from assembly 'CliLibrary, Version=1.0.4843.17337, Culture=neutral, PublicKeyToken=null'.

我怎么能解决这个错误?

2 个答案:

答案 0 :(得分:2)

嗯,这是一个痛苦的问题。它肯定解释了为什么你是我遇到的第一个实际使用它的程序员。问题是由afxwinforms.h中的声明引起的:

public ref class CWin32Window : public System::Windows::Forms::IWin32Window
// etc..

public 关键字是杀手,它将类添加到程序集的清单中。因此,当您在另一个也包含标题的项目中引用它时,该类有两个定义。该标题中的本机类和托管类的混合阻止了一个干净的解决方案。

我认为你已经找到了最好的解决方案,使用#include和#pragma comment(disable:4944)来关闭编译器。在命名空间中包含标题可能是另一个可行的hack,它重命名CWin32Window的命名空间,但是在链接mfcm90.lib时我会遇到麻烦。重构您的解决方案并将所有winforms代码保留在一个项目中是我唯一可以推荐的。

答案 1 :(得分:0)

您使用的是afxwinforms.h中的类型吗?

如果不是(就像在我的情况下),解决方案是评论包含并添加这两行:

#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>

或在项目中添加对这两个程序集的引用。