迁移C++/CLI库到.NET 6:如何正确引用.NETCoreApp?
解决C++/CLI项目从.NET Framework 4.8迁移到.NET 6的目标框架配置问题
正确配置方案
针对C++/CLI项目,你需要调整以下关键配置,避免框架引用冲突:
指定正确的目标框架标识符
在<PropertyGroup Label="Globals">中,将<TargetFramework>设置为**net6.0-windows**,而非单纯的net6.0或.netcoreapp6.0。C++/CLI依赖Windows平台的.NET实现,必须使用带-windows后缀的目标框架Moniker(TFM)。移除多余的框架属性
删除所有冗余的<TargetFrameworks>、<TargetFrameworkVersion>或<TargetFrameworkIdentifier>配置,这些属性会和<TargetFramework>产生冲突,导致NETSDK1013或未引用框架的错误。确认CLR支持设置
确保所有Configuration节点中的<CLRSupport>已设置为NetCore(你的项目中已经正确配置,只需保留)。
修改后的关键配置片段
<PropertyGroup Label="Globals"> <ProjectGuid>[some guid]</ProjectGuid> <TargetFramework>net6.0-windows</TargetFramework> <Keyword>ManagedCProj</Keyword> <RootNamespace>[namespace]</RootNamespace> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <ProjectName>[project name]</ProjectName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <PlatformToolset>v143</PlatformToolset> <CLRSupport>NetCore</CLRSupport> <CharacterSet>Unicode</CharacterSet> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> <PlatformToolset>v143</PlatformToolset> <CLRSupport>NetCore</CLRSupport> <CharacterSet>Unicode</CharacterSet> </PropertyGroup>
额外修复步骤
- 重新执行NuGet还原:在Visual Studio中右键项目 → 管理NuGet程序包 → 点击"还原",或在终端运行
dotnet restore。 - 检查第三方程序集兼容性:确认你引用的
Microsoft.Practices.Unity、Newtonsoft.Json等库是否有适配.NET 6的版本。如果使用的是.NET Framework版本的程序集,可能需要替换为.NET Standard/.NET 6兼容版本,否则会导致运行时错误。 - 清理项目缓存:删除项目目录下的
bin、obj文件夹,重新生成项目。
错误原因说明
- 你之前使用
net6.0而非net6.0-windows:C++/CLI项目依赖Windows特定的.NET运行时组件,纯net6.0无法满足其平台需求,导致框架引用缺失。 - 错误使用
<TargetFrameworks>格式:该属性需要使用简写的TFM(如net6.0-windows),而非.NETCoreApp,Version=v6.0这种完整标识符字符串,这会触发NETSDK1013识别错误。 - 多属性冲突:同时设置
<TargetFramework>和<TargetFrameworks>会让MSBuild无法确定目标框架,回到初始的未引用框架错误。
修改后的完整.vcxproj文件
<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|x64"> <Configuration>Debug</Configuration> <Platform>x64</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|x64"> <Configuration>Release</Configuration> <Platform>x64</Platform> </ProjectConfiguration> </ItemGroup> <PropertyGroup Label="Globals"> <ProjectGuid>[some guid]</ProjectGuid> <TargetFramework>net6.0-windows</TargetFramework> <Keyword>ManagedCProj</Keyword> <RootNamespace>[namespace]</RootNamespace> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> <ProjectName>[project name]</ProjectName> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <PlatformToolset>v143</PlatformToolset> <CLRSupport>NetCore</CLRSupport> <CharacterSet>Unicode</CharacterSet> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> <PlatformToolset>v143</PlatformToolset> <CLRSupport>NetCore</CLRSupport> <CharacterSet>Unicode</CharacterSet> </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>true</LinkIncremental> <ReferencePath>$(VC_ReferencesPath_x64);..\Libraries</ReferencePath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <LinkIncremental>false</LinkIncremental> <ReferencePath>$(VC_ReferencesPath_x64);..\Libraries</ReferencePath> </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PrecompiledHeader>Use</PrecompiledHeader> <AdditionalIncludeDirectories>[folder paths]</AdditionalIncludeDirectories> <TreatWarningAsError>true</TreatWarningAsError> <DisableSpecificWarnings>4691;%(DisableSpecificWarnings)</DisableSpecificWarnings> </ClCompile> <Link> <AdditionalDependencies>[.lib files]</AdditionalDependencies> <AdditionalLibraryDirectories>[folder paths]</AdditionalLibraryDirectories> <AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions> </Link> <PreBuildEvent> <Command>[some PowerShell commands]</Command> </PreBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> <WarningLevel>Level4</WarningLevel> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PrecompiledHeader>Use</PrecompiledHeader> <AdditionalIncludeDirectories>[folder paths]</AdditionalIncludeDirectories> <Optimization>Disabled</Optimization> <TreatWarningAsError>true</TreatWarningAsError> <DisableSpecificWarnings>4691;%(DisableSpecificWarnings)</DisableSpecificWarnings> </ClCompile> <Link> <AdditionalDependencies>[.lib files]</AdditionalDependencies> <AdditionalLibraryDirectories>[folder paths]</AdditionalLibraryDirectories> </Link> <PreBuildEvent> <Command>[some PowerShell commands]</Command> </PreBuildEvent> </ItemDefinitionGroup> <ItemGroup> <Reference Include="Microsoft.Practices.Unity"> <HintPath>..\Libraries\Microsoft.Practices.Unity.dll</HintPath> </Reference> <Reference Include="Newtonsoft.Json"> <HintPath>..\Libraries\Newtonsoft.Json.dll</HintPath> </Reference> [some internal .NET assembly references] </ItemGroup> <ItemGroup> <ClInclude Include="[.h file]" /> [more .h file includes] </ItemGroup> <ItemGroup> <ClCompile Include="AssemblyInfo.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> </ClCompile> [more .cpp file compile elements] </ItemGroup> <ItemGroup> <ResourceCompile Include="app.rc" /> </ItemGroup> <ItemGroup> <Image Include="app.ico" /> </ItemGroup> <ItemGroup> [a project reference to a C# project in the same solution] </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> </Project>
内容的提问来源于stack exchange,提问作者O. R. Mapper
相关产品推荐
相关产品推荐

