问题描述
在一个混合的C ++ / CLI组装项目中,我如何知道哪些文件/函数将本机编译以及哪些将被管理?
在Windows 10上,Visual Studio 2019 v16.7.4,.Net SDK v3.1.402:
我使用下面的简单托管代码创建了一个新的“ CLR类库(.NET Core)”项目。唯一的其他变化是禁用了预编译头(在“ 项目属性→C / C ++→预编译头”下)。
// CLRClassLibraryCore.h
#pragma once
using namespace System;
namespace CLRClassLibraryCore {
public ref class ManagedClass
{
public:
void Print(System::String^ message);
};
}
// CLRClassLibraryCore.cpp
#include "CLRClassLibraryCore.h"
namespace CLRClassLibraryCore
{
void ManagedClass::Print(System::String^ message)
{
System::Console::WriteLine(message);
}
}
当我开始创建本机类时,我想知道如何确保它可以本机编译,而不是MSIL,并发现在Visual Studio .cpp文件中,大量的额外属性“隐藏”在弹出窗口中属性对话框(“ 右键单击→属性”在解决方案资源管理器中)。
我很高兴找到每个文件的“公共语言运行时支持”(在“ 配置属性→C / C ++→常规”下),但无法使其正常工作。
默认值为“ NetCore”-这不是下拉列表中的4个选项之一...
无
/ clr
/ clr:pure
/ clr:safe
我很惊讶地看到纯净和安全的选项,因为MSVC compiler reference明确指出这些选项“已在Visual Studio 2017及更高版本中删除”。
所以我测试了/ clr选项,并在构建过程中获得了奖励:
... \ 3.1.0 \ ref \ netcoreapp3.1 \ mscorlib.dll
致命错误C1001:内部编译器错误。
(编译文件'msc1.cpp',第1591行)
进一步挖掘,我可以看到该选项保存在.vcxproj文件<CompileAsManaged>
标记中,分别为“ true”,“ false”或“ NetCore”。
这是怎么回事?
如何确保.Net Core C ++ / CLI本机代码确实是本机编译的?
背景:我已经将C#.Net Framework程序集重新设计为WPF .Net Core,现在想从本机C ++应用程序的本机C ++插件中使用它。
解决方法
编写其他文件,而不包含任何非标准库。坚持使用 STL ( std 名称空间)。