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