如何确定代码是非托管代码还是CLR代码?

问题描述

一个混合的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

VS CLR options

我很惊讶地看到纯净和安全的选项,因为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 名称空间)。