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

oll*_*exx 2 c# c++ msbuild visual-studio

我正在将 wpf .net 4.7 解决方案迁移到 .net core 3.1 我正在使用 Visual Studio 16.6.3。wpf 项目在 .net core 上编译得很好。但依赖的 c++/cli 项目无法编译。我根据此https://learn.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>
Run Code Online (Sandbox Code Playgroud)

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

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

c:\program files\dotnet\packs\microsoft.netcore.app.ref\3.1.0\ref\netcoreapp3.1\mscorlib.dll:致命错误 C1001:内部编译器错误。(编译器文件“msc1.cpp”,第 1533 行)

即使我添加最简单的 cpp 文件并用右键单击编译它,也会发生相同的错误,所以它并不真正取决于 cpp 代码

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

cli 项目在迁移之前编译良好。

Mr *_*ian 8

将 c++/cli 项目从 .net 4.7 迁移到 .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.
Run Code Online (Sandbox Code Playgroud)

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

2)右键c++项目-->属性--> C/C++ -->优化-->设置OptimizationDisabled(/Od)

通过 Project Properties --> Linker --> Optimization更改Link Time Code Generation为。/LTCG

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

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

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

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

更新

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

实际上,由于某些原因,该节点与您的项目存在冲突,无论其值为truefalse

解决方案

删除文件中的该节点xxx.vcxproj

<CompileAsManaged>true</CompileAsManaged>
Run Code Online (Sandbox Code Playgroud)

然后你就会像我一样成功构建你的项目。