How to link NuGet package to a native C++ application using CMake and Visual Studio
The Microsoft.Web.WebView2 component is distributed through the Nuget package repository (https://www.nuget.org).
How to link it to a native C++ project that uses CMake and is compiled using Visual Studio without vcpkg?
First way
You can run the nuget command from CMakeLists.txt, install packages in some directory and include .targets files.
find_program(NUGET_EXE NAMES nuget)
if(NOT NUGET_EXE)
message("NUGET.EXE not found.")
message(FATAL_ERROR "Please install this executable, and run CMake again.")
endif()
execute_process(COMMAND ${NUGET_EXE} install "Microsoft.Web.WebView2" -Version 1.0.2592.51 -ExcludeVersion -OutputDirectory ${CMAKE_BINARY_DIR}/packages)
execute_process(COMMAND ${NUGET_EXE} install "Microsoft.Windows.ImplementationLibrary" -Version 1.0.240122.1 -ExcludeVersion -OutputDirectory ${CMAKE_BINARY_DIR}/packages)
set_target_properties(app PROPERTIES VS_GLOBAL_WebView2LoaderPreference "Static")
target_link_libraries(app PUBLIC ${CMAKE_BINARY_DIR}/packages/Microsoft.Web.WebView2/build/native/Microsoft.Web.WebView2.targets)
target_link_libraries(app PUBLIC ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.ImplementationLibrary/build/native/Microsoft.Windows.ImplementationLibrary.targets)
However, no matter how hard I tried, the dynamic library was linked. You can, of course, go further and specify the paths to the .lib files, taking into account the target architecture, but there was a better way.
Second way
You need to create the following YourApp.props file in the project root:
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ItemGroup Condition="'$(MSBuildProjectExtension)' == '.vcxproj'">
<ProjectCapability Include="PackageReferences" />
</ItemGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.vcxproj'">
<NuGetTargetMoniker Condition="'$(NuGetTargetMoniker)' == ''">native,Version=v0.0</NuGetTargetMoniker>
<RuntimeIdentifiers Condition="'$(RuntimeIdentifiers)' == ''">win;win-x86;win-x64;win-arm;win-arm64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
This file will allow VS to work with PackageReference in vcxproj projects.
And add these lines to your CMakeLists.txt:
set_target_properties(app PROPERTIES VS_GLOBAL_WebView2LoaderPreference "Static")
set_target_properties(app PROPERTIES VS_USER_PROPS "${CMAKE_SOURCE_DIR}/YourApp.props")
set_target_properties(app PROPERTIES VS_PACKAGE_REFERENCES "Microsoft.Web.WebView2_1.0.2592.51;Microsoft.Windows.ImplementationLibrary_1.0.240122.1")
Tested on CMake 3.29.5 and Microsoft Visual Studio Community 2019 Version 16.11.36