将 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
隐藏文件夹,输出文件夹如Debug
或x64
(解决方案文件夹和项目文件夹)
2)右击c++项目-->Properties-->C/C++-->优化-->设置Optimization
为Disabled(/Od)
通过项目 Properties 将 Link Time Code Generation
更改为 /LTCG
--> Linker --> 优化.
除此之外,请尝试新建一个默认的C++ Clr Net Core工程,然后测试是否可以编译成功。
如果是这样,您可以尝试将旧项目迁移到新项目中。
此外,您可以与我们分享一个最小的、可重现的示例,以便我们可以更快地解决您的问题。
====================
更新
原因是您在 xxx.vcxproj
文件中使用了 CompileAsManaged
xml 节点,而您的 net core clr 项目不需要该节点。有了它,您将失去程序集引用。
实际上,由于某些原因,该节点与您的项目冲突,无论其值为true
还是false
。
解决方案
删除 xxx.vcxproj
文件中的这个节点。
<CompileAsManaged>true</CompileAsManaged>
那么你就会像我一样成功构建你的项目。
我正在将 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
隐藏文件夹,输出文件夹如Debug
或x64
(解决方案文件夹和项目文件夹)
2)右击c++项目-->Properties-->C/C++-->优化-->设置Optimization
为Disabled(/Od)
通过项目 Properties 将 Link Time Code Generation
更改为 /LTCG
--> Linker --> 优化.
除此之外,请尝试新建一个默认的C++ Clr Net Core工程,然后测试是否可以编译成功。
如果是这样,您可以尝试将旧项目迁移到新项目中。
此外,您可以与我们分享一个最小的、可重现的示例,以便我们可以更快地解决您的问题。
====================
更新
原因是您在 xxx.vcxproj
文件中使用了 CompileAsManaged
xml 节点,而您的 net core clr 项目不需要该节点。有了它,您将失去程序集引用。
实际上,由于某些原因,该节点与您的项目冲突,无论其值为true
还是false
。
解决方案
删除 xxx.vcxproj
文件中的这个节点。
<CompileAsManaged>true</CompileAsManaged>
那么你就会像我一样成功构建你的项目。