【问题标题】:problems migrating c++/cli project from .net 4.7 to .netcore 3.1将 c++/cli 项目从 .net 4.7 迁移到 .net core 3.1 的问题
【发布时间】:2020-10-26 11:56:48
【问题描述】:

我正在将 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>

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

但现在以前编译好的 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 项目在迁移之前编译良好。

【问题讨论】:

  • 您是否也将&lt;FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" /&gt; 添加到项目中,以便能够使用这些程序集?
  • @thatguy 是的,已添加
  • 也许一旦你需要尝试从构建的输出目录中删除所有项目,清理解决方案并重建解决方案
  • @Dimple Patel 我试过了,但没有成功,只是这个奇怪的编译器错误,即使有详细的日志
  • 您是否将每个CLRSupport 更改为NetCore?另外,关闭VS实例,尝试从解决方案文件夹中删除.vs隐藏文件夹,DebugReleasex64....解决方案文件夹或项目文件夹中的任何输出文件夹,然后重新启动VS到再次测试。

标签: c# c++ visual-studio msbuild


【解决方案1】:

将 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.

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

2) 右击c++项目-->Properties-->C/C++-->优化-->将Optimization设置为Disabled(/Od)

通过项目属性Link Time Code Generation更改为/LTCG --> 链接器 --> 优化

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

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

此外,您可以与我们分享一个可重复的最小样本,以便我们更快地解决您的问题。

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

更新

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

其实,无论是true还是false,这个节点都和你的项目有冲突。

解决方案

xxx.vcxproj 文件中删除此节点。

<CompileAsManaged>true</CompileAsManaged>

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

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2020-08-22
    相关资源
    最近更新 更多