将 c++/cli 项目从 .net 4.7 迁移到 .net core 3.1 时出现问题

problems migrating c++/cli project from .net 4.7 to .netcore 3.1

我正在将 wpf .net 4.7 解决方案迁移到 .net core 3.1 我正在使用 Visual Studio 16.6.3。 wpf 项目使用 .net 核心编译良好。 但依赖的 c++/cli 项目无法编译。 我根据这个 https://docs.microsoft.com/de-de/dotnet/core/porting/cpp-cli 更改了.vcxproject。 vcxproject 现在看起来像:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <VCProjectVersion>16.0</VCProjectVersion>
    <ProjectGuid>...</ProjectGuid>
    <Keyword></Keyword>
    <RootNamespace>XY</RootNamespace>
    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v142</PlatformToolset>
    <CharacterSet>MultiByte</CharacterSet>
    <CLRSupport>NetCore</CLRSupport>
    <VCToolsVersion>14.26.28801</VCToolsVersion>
  </PropertyGroup>
 
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LinkIncremental>false</LinkIncremental>
    <OutDir>$(ProjectDir)..\..\build\</OutDir>
    <IntDir>$(ProjectDir)..\..\tmp$(ProjectName)\</IntDir>
    <EnableManagedIncrementalBuild>true</EnableManagedIncrementalBuild>
    <IncludePath>$(IncludePath)</IncludePath>
    <IgnoreImportLibrary>false</IgnoreImportLibrary>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <!-- <LinkIncremental>false</LinkIncremental>    -->
    <LinkIncremental>true</LinkIncremental>
    <OutDir>$(ProjectDir)..\..\build\</OutDir>
    <IntDir>$(ProjectDir)..\..\tmp$(ProjectName)\</IntDir>
    <EnableManagedIncrementalBuild>true</EnableManagedIncrementalBuild>
    <IncludePath>$(IncludePath)</IncludePath>
    <IgnoreImportLibrary>false</IgnoreImportLibrary>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <PrecompiledHeader>NotUsing</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;WIN32;%(PreprocessorDefinitions);WS_CPLUSPLUS</PreprocessorDefinitions>
      <ConformanceMode>false</ConformanceMode>
      <PrecompiledHeaderFile>
      </PrecompiledHeaderFile>
      <AdditionalIncludeDirectories></AdditionalIncludeDirectories>
      <AdditionalUsingDirectories>
      </AdditionalUsingDirectories>
      <LanguageStandard>stdcpp17</LanguageStandard>
      <CompileAsManaged>true</CompileAsManaged>
      <CallingConvention>
      </CallingConvention>
      <UndefinePreprocessorDefinitions>
      </UndefinePreprocessorDefinitions>
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
      <LanguageStandard>stdcpp17</LanguageStandard>
      <DiagnosticsFormat>Classic</DiagnosticsFormat>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>DebugFull</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
      <AdditionalLibraryDirectories></AdditionalLibraryDirectories>
      <AdditionalDependencies>opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;gdiplus.lib;d2d1.lib;%(AdditionalDependencies);WebServices.lib</AdditionalDependencies>
      <PreventDllBinding>false</PreventDllBinding>
      <Profile>false</Profile>
      <AdditionalOptions></AdditionalOptions>
    </Link>
  </ItemDefinitionGroup>
 

  <ItemGroup>
    <FrameworkReference Include="Microsoft.WindowsDesktop.App" />
  </ItemGroup>
  
  ...
</Project>

根据上述link,系统引用应该被删除并由 vs 自动加载,因为 <CLRSupport>NetCore</CLRSupport>

但现在以前编译好的 CPP 文件不再编译并出现以下错误

c:\program files\dotnet\packs\microsoft.netcore.app.ref.1.0\ref\netcoreapp3.1\mscorlib.dll : fatal error C1001: Internal compiler error. (compiler file 'msc1.cpp', line 1533)

即使我添加最简单的cpp文件并右击-编译也会出现同样的错误,所以它并不真正依赖于cpp代码

当我将鼠标悬停在编辑器中 CPP 文件的第一个字符上时,它显示 'System' 未从默认程序集加载

迁移前 cli 项目编译正常。

problems migrating c++/cli project from .net 4.7 to .netcore 3.1

我这边测试过:按照指导文档将一个net framework clr项目迁移到net core clr项目,没有任何错误。

所以请尝试以下建议:

建议

请检查以确保您在 xxx.vcxproj 文件中使用这些属性。

<TargetFramework>netcoreapp3.1</TargetFramework>
<CLRSupport>NetCore</CLRSupport> //there are four parts that need to be edited.

1)关闭VS实例,删除.vs隐藏文件夹,输出文件夹如Debugx64(解决方案文件夹和项目文件夹)

2)右击c++项目-->Properties-->C/C++-->优化-->设置OptimizationDisabled(/Od)

通过项目 PropertiesLink Time Code Generation 更改为 /LTCG --> Linker --> 优化.

除此之外,请尝试新建一个默认的C++ Clr Net Core工程,然后测试是否可以编译成功。

如果是这样,您可以尝试将旧项目迁移到新项目中。

此外,您可以与我们分享一个最小的、可重现的示例,以便我们可以更快地解决您的问题。

====================

更新

原因是您在 xxx.vcxproj 文件中使用了 CompileAsManaged xml 节点,而您的 net core clr 项目不需要该节点。有了它,您将失去程序集引用。

实际上,由于某些原因,该节点与您的项目冲突,无论其值为true还是false

解决方案

删除 xxx.vcxproj 文件中的这个节点。

<CompileAsManaged>true</CompileAsManaged>

那么你就会像我一样成功构建你的项目。