C++/CLI:错误 C1190:包含 'vcclr.h' 时出现“需要/clr”选项

C++/CLI: Error C1190: ''/clr' option required' occurs when including 'vcclr.h'

我有一个 C++/CLI 库,它将被 WPF 应用程序使用。在这个库中,我试图将托管类型传递给仅接受 LPARAM 参数的非托管函数。我尝试使用 gcroot 来实现这一点。包含 gcroot.h 会引发更多编译器错误,因此我包含 vcclr.h

问题是,一旦我包含 vcclr.h header,编译器就会抛出以下错误:

fatal error C1190: Managed code requires a '/clr' option

但是在我的项目属性中,我已经在 Project properties -> GeneralProject properties -> C/C++ -> General 下为配置('Debug' 和 'Release')和所有平台('Win32' 和 'x64').

错误发生在vcclr.h的下面一行:

#using <mscorlib.dll>

例如在 DLL 的主 cpp 文件中写入相同的行似乎不会导致此错误。

我在项目中使用的平台工具集是Visual Studio 2017 (v141)


我知道关于此错误还有大约五个其他问题。但就我而言 none 的答案可以帮助我解决我的问题。这同样适用于关于 gcroot.

的问题

这是一个棘手的问题。一般来说,如果你有 "way to much error messages" 然后选择过去的方式可能会在错误的一端减少混乱。 所以你的问题的答案。 如果您想使用 <gcroot.h>,请不要使用 <vcclr.h>,因为错误。最好 post 此处出错。

TLTR;尝试在包含之前使用 #ifdef _MANAGED 。这将避免任何其他编译单元读取未使用“/CLR”编译的代码。

如何调试较大项目中出现的大量错误?

肯定有更好的方法,但有时我会回去确保我确实理解我的编译错误。

  • 找出哪个编译单元出错。
    • 单独编译您拥有的每个 cpp 文件。 Right-click 在解决方案资源管理器中的文件上搜索并单击编译。
      • 如果没有错误,不是这个文件。

好吧,你找到了那个坏的。

现在你会找到几个原因并根据那个选项:

  • 您在包含之前使用了 #pragma manged(off)。 该编译指示的 Microsoft 文档将其视为未定义行为。抱歉 :-/ ,我也是在微软 12 月更新 VS2017 后才知道的。
  • 有一个文件需要 <thread> or <mutex> 而你做了 pimpl-ideom 但你确实有一个你无法用 /clr 编译的文件 好吧,重新开始,重构你的项目以不包含来自那些 un-managed 编译单元的 "managed" 头文件。