From 91d3a7192254194bc2cb800fe00f1c505dd29ebc Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Wed, 8 Apr 2026 17:14:34 -0700 Subject: [PATCH 01/13] Add .NET DLL for SDK projection to NuGet package --- .gitignore | 3 +- CMakeLists.txt | 2 ++ cmake/findCSharp.cmake | 28 +++++++++++++++ nuget/Microsoft.WSL.Containers.nuspec.in | 8 +++-- .../Microsoft.WSL.Containers.common.targets | 10 ------ .../native/Microsoft.WSL.Containers.targets | 7 ++-- .../net/Microsoft.WSL.Containers.targets | 14 -------- .../net8.0/Microsoft.WSL.Containers.targets | 31 +++++++++++++++++ .../Microsoft.WSL.ContainersConfig.cmake | 2 +- src/windows/WslcSDK/csharp/CMakeLists.txt | 13 +++++++ src/windows/WslcSDK/csharp/Projection.cs | 8 +++++ src/windows/wslsettings/CMakeLists.txt | 34 +------------------ 12 files changed, 95 insertions(+), 65 deletions(-) create mode 100644 cmake/findCSharp.cmake delete mode 100644 nuget/Microsoft.WSL.Containers/build/Microsoft.WSL.Containers.common.targets delete mode 100644 nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets create mode 100644 nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets create mode 100644 src/windows/WslcSDK/csharp/CMakeLists.txt create mode 100644 src/windows/WslcSDK/csharp/Projection.cs diff --git a/.gitignore b/.gitignore index 659e3909b..9dcdf8197 100644 --- a/.gitignore +++ b/.gitignore @@ -68,4 +68,5 @@ directory.build.targets test-storage/ *.vhdx *.tar -*.etl \ No newline at end of file +*.etl +*.lscache diff --git a/CMakeLists.txt b/CMakeLists.txt index 1400001af..619d51b0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,7 @@ find_package(NUGET REQUIRED) find_package(VERSION REQUIRED) find_package(MC REQUIRED) find_package(Appx REQUIRED) +find_package(CSharp REQUIRED) # Download nuget packages restore_nuget_packages() @@ -490,6 +491,7 @@ add_subdirectory(src/windows/wslrelay) add_subdirectory(src/windows/wslinstall) add_subdirectory(src/windows/wslc) add_subdirectory(src/windows/WslcSDK) +add_subdirectory(src/windows/WslcSDK/csharp) if (WSL_BUILD_WSL_SETTINGS) add_subdirectory(src/windows/libwsl) diff --git a/cmake/findCSharp.cmake b/cmake/findCSharp.cmake new file mode 100644 index 000000000..8681f8f2c --- /dev/null +++ b/cmake/findCSharp.cmake @@ -0,0 +1,28 @@ +function(configure_csharp_target TARGET) + project(${TARGET} LANGUAGES CSharp) + + # Set the C# language version (defaults to 3.0). + set(CMAKE_CSharp_FLAGS "/langversion:latest") + + target_compile_options( + ${TARGET} + PRIVATE "/debug:full" + ) + + set(TARGET_PLATFORM_VERSION "10.0.26100.0") + set(WINDOWS_TARGET_PLATFORM_VERSION "windows${TARGET_PLATFORM_VERSION}") + set(TARGET_PLATFORM_MIN_VERSION "10.0.19041.0") + set(WINDOWS_TARGET_PLATFORM_MIN_VERSION "windows${TARGET_PLATFORM_MIN_VERSION}") + + set_target_properties( + ${TARGET} PROPERTIES + VS_GLOBAL_TargetPlatformVersion "${TARGET_PLATFORM_VERSION}" + VS_GLOBAL_TargetPlatformMinVersion "${TARGET_PLATFORM_MIN_VERSION}" + VS_GLOBAL_WindowsSdkPackageVersion "${WINDOWS_SDK_DOTNET_VERSION}" + VS_GLOBAL_AppendRuntimeIdentifierToOutputPath false + VS_GLOBAL_GenerateAssemblyInfo false + VS_GLOBAL_TargetLatestRuntimePatch false + DOTNET_SDK "Microsoft.NET.Sdk" + DOTNET_TARGET_FRAMEWORK "net8.0-${WINDOWS_TARGET_PLATFORM_VERSION}" + ) +endfunction() \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index 0c8628ed5..0a831af2e 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -11,13 +11,17 @@ en-us MIT docs\README.MD + + + + - + - + diff --git a/nuget/Microsoft.WSL.Containers/build/Microsoft.WSL.Containers.common.targets b/nuget/Microsoft.WSL.Containers/build/Microsoft.WSL.Containers.common.targets deleted file mode 100644 index 2454f2555..000000000 --- a/nuget/Microsoft.WSL.Containers/build/Microsoft.WSL.Containers.common.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets index 09823c7b0..8f45a9177 100644 --- a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets @@ -1,8 +1,5 @@ - - $(Platform) - @@ -22,5 +19,7 @@ - + + + \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets deleted file mode 100644 index 245e57a2c..000000000 --- a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets +++ /dev/null @@ -1,14 +0,0 @@ - - - - x64 - arm64 - - - - $(Platform) - - - - - \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets new file mode 100644 index 000000000..0df6a025a --- /dev/null +++ b/nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets @@ -0,0 +1,31 @@ + + + + + + + <_wslcSdkPlatform Condition="$(RuntimeIdentifier.EndsWith('-x64'))">x64 + <_wslcSdkPlatform Condition="$(RuntimeIdentifier.EndsWith('-arm64'))">arm64 + <_wslcSdkInvalidPlatformProperty Condition="'$(_wslcSdkPlatform)' == ''">RuntimeIdentifier + <_wslcSdkInvalidPlatform Condition="'$(_wslcSdkPlatform)' == ''">$(RuntimeIdentifier) + + + + + <_wslcSdkPlatform Condition="'$(PlatformTarget)' == 'x64'">x64 + <_wslcSdkPlatform Condition="'$(PlatformTarget)' == 'arm64'">arm64 + <_wslcSdkInvalidPlatformProperty Condition="'$(_wslcSdkPlatform)' == ''">PlatformTarget + <_wslcSdkInvalidPlatform Condition="'$(_wslcSdkPlatform)' == ''">$(PlatformTarget) + + + + + + + + + + + + \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers/cmake/Microsoft.WSL.ContainersConfig.cmake b/nuget/Microsoft.WSL.Containers/cmake/Microsoft.WSL.ContainersConfig.cmake index 0ea5f0642..4829bed47 100644 --- a/nuget/Microsoft.WSL.Containers/cmake/Microsoft.WSL.ContainersConfig.cmake +++ b/nuget/Microsoft.WSL.Containers/cmake/Microsoft.WSL.ContainersConfig.cmake @@ -47,7 +47,7 @@ add_library(Microsoft.WSL.Containers::SDK SHARED IMPORTED GLOBAL) set_target_properties(Microsoft.WSL.Containers::SDK PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_wslcsdk_include_dir}" IMPORTED_IMPLIB "${_wslcsdk_lib_dir}/wslcsdk.lib" - IMPORTED_LOCATION "${_wslcsdk_lib_dir}/wslcsdk.dll" + IMPORTED_LOCATION "${_wslcsdk_lib_dir}/native/wslcsdk.dll" ) # Clean up temporary variables diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt new file mode 100644 index 000000000..d8f3a2694 --- /dev/null +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -0,0 +1,13 @@ +project(wslcsdkcs LANGUAGES CSharp) + +add_library(wslcsdkcs SHARED "Projection.cs") +configure_csharp_target(wslcsdkcs) + +set_target_properties( + wslcsdkcs PROPERTIES + FOLDER windows + LINKER_LANGUAGE CSharp + VS_GLOBAL_PlatformTarget "AnyCPU" +) + +add_dependencies(wslcsdkcs wslcsdk) diff --git a/src/windows/WslcSDK/csharp/Projection.cs b/src/windows/WslcSDK/csharp/Projection.cs new file mode 100644 index 000000000..96fe29c91 --- /dev/null +++ b/src/windows/WslcSDK/csharp/Projection.cs @@ -0,0 +1,8 @@ +namespace Microsoft.WSL.Containers +{ + // This is only a placeholder so that we can compile a DLL. + // The actual implementation of the projection will be added later. + internal class Projection + { + } +} \ No newline at end of file diff --git a/src/windows/wslsettings/CMakeLists.txt b/src/windows/wslsettings/CMakeLists.txt index 6b1983527..8a1e3b2aa 100644 --- a/src/windows/wslsettings/CMakeLists.txt +++ b/src/windows/wslsettings/CMakeLists.txt @@ -1,6 +1,6 @@ set(TargetApp wslsettings) -project(${TargetApp} LANGUAGES CSharp) +configure_csharp_target(${TargetApp}) # needed for csharp_set_xaml_cs_properties include(CSharpUtilities) @@ -189,15 +189,8 @@ set_property( "ApplicationDefinition" ) -# Set the C# language version (defaults to 3.0). -set( - CMAKE_CSharp_FLAGS - "/langversion:latest" -) - target_compile_options( ${TargetApp} - PRIVATE "/debug:full" PRIVATE "/unsafe" ) @@ -218,23 +211,6 @@ Microsoft.Xaml.Behaviors.WinUI.Managed_${XAML_BEHAVIORS_VERSION};\ WinUIEx_${WINUIEX_VERSION}" ) -set( - TARGET_PLATFORM_VERSION - "10.0.26100.0" -) -set( - WINDOWS_TARGET_PLATFORM_VERSION - "windows${TARGET_PLATFORM_VERSION}" -) -set( - TARGET_PLATFORM_MIN_VERSION - "10.0.19041.0" -) -set( - WINDOWS_TARGET_PLATFORM_MIN_VERSION - "windows${TARGET_PLATFORM_MIN_VERSION}" -) - set_target_properties( ${TargetApp} PROPERTIES # ----- Dotnet, Windows App SDK and WinUI stuff starts here ----- @@ -252,16 +228,8 @@ set_target_properties( VS_GLOBAL_Platform "${TARGET_PLATFORM}" VS_GLOBAL_Platforms "${TARGET_PLATFORM}" VS_GLOBAL_PlatformTarget "${TARGET_PLATFORM}" - VS_GLOBAL_TargetPlatformVersion "${TARGET_PLATFORM_VERSION}" - VS_GLOBAL_TargetPlatformMinVersion "${TARGET_PLATFORM_MIN_VERSION}" - VS_GLOBAL_WindowsSdkPackageVersion "${WINDOWS_SDK_DOTNET_VERSION}" VS_GLOBAL_ImplicitUsings enable VS_GLOBAL_Nullable enable - VS_GLOBAL_AppendRuntimeIdentifierToOutputPath false - VS_GLOBAL_GenerateAssemblyInfo false - VS_GLOBAL_TargetLatestRuntimePatch false - DOTNET_SDK "Microsoft.NET.Sdk" - DOTNET_TARGET_FRAMEWORK "net8.0-${WINDOWS_TARGET_PLATFORM_VERSION}" ) configure_file( From 655d39c90bbacaa5f1e36189cd1d50841357c049 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Wed, 15 Apr 2026 12:11:17 -0700 Subject: [PATCH 02/13] PR feedback --- CMakeLists.txt | 5 ++++ cmake/FindCSharp.cmake | 13 +++++++++ cmake/findCSharp.cmake | 28 ------------------- nuget/Microsoft.WSL.Containers.nuspec.in | 7 +++-- .../Microsoft.WSL.Containers.targets | 2 +- src/windows/WslcSDK/csharp/CMakeLists.txt | 2 +- src/windows/wslsettings/CMakeLists.txt | 4 ++- 7 files changed, 27 insertions(+), 34 deletions(-) create mode 100644 cmake/FindCSharp.cmake delete mode 100644 cmake/findCSharp.cmake rename nuget/Microsoft.WSL.Containers/build/{net8.0 => net}/Microsoft.WSL.Containers.targets (96%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 619d51b0b..ffb07b12b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,6 +273,11 @@ if (${TARGET_PLATFORM} STREQUAL "x64") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /CETCOMPAT") endif() +set(CMAKE_CSharp_FLAGS "${CMAKE_CSharp_FLAGS} /langversion:latest /debug:full") +set(CMAKE_DOTNET_SDK "Microsoft.NET.Sdk") +set(CMAKE_DOTNET_TARGET_FRAMEWORK "net8.0-windows${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") +set(WSL_NUGET_TARGET_FRAMEWORK "net8.0-windows10.0.19041.0") + # Common link libraries link_directories(${WSLDEPS_SOURCE_DIR}/lib/) set(COMMON_LINK_LIBRARIES diff --git a/cmake/FindCSharp.cmake b/cmake/FindCSharp.cmake new file mode 100644 index 000000000..1c59c0b38 --- /dev/null +++ b/cmake/FindCSharp.cmake @@ -0,0 +1,13 @@ +function(configure_csharp_target TARGET) + set(TARGET_PLATFORM_MIN_VERSION "10.0.19041.0") + + set_target_properties( + ${TARGET} PROPERTIES + VS_GLOBAL_TargetPlatformVersion "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" + VS_GLOBAL_TargetPlatformMinVersion "${TARGET_PLATFORM_MIN_VERSION}" + VS_GLOBAL_WindowsSdkPackageVersion "${WINDOWS_SDK_DOTNET_VERSION}" + VS_GLOBAL_AppendRuntimeIdentifierToOutputPath false + VS_GLOBAL_GenerateAssemblyInfo false + VS_GLOBAL_TargetLatestRuntimePatch false + ) +endfunction() \ No newline at end of file diff --git a/cmake/findCSharp.cmake b/cmake/findCSharp.cmake deleted file mode 100644 index 8681f8f2c..000000000 --- a/cmake/findCSharp.cmake +++ /dev/null @@ -1,28 +0,0 @@ -function(configure_csharp_target TARGET) - project(${TARGET} LANGUAGES CSharp) - - # Set the C# language version (defaults to 3.0). - set(CMAKE_CSharp_FLAGS "/langversion:latest") - - target_compile_options( - ${TARGET} - PRIVATE "/debug:full" - ) - - set(TARGET_PLATFORM_VERSION "10.0.26100.0") - set(WINDOWS_TARGET_PLATFORM_VERSION "windows${TARGET_PLATFORM_VERSION}") - set(TARGET_PLATFORM_MIN_VERSION "10.0.19041.0") - set(WINDOWS_TARGET_PLATFORM_MIN_VERSION "windows${TARGET_PLATFORM_MIN_VERSION}") - - set_target_properties( - ${TARGET} PROPERTIES - VS_GLOBAL_TargetPlatformVersion "${TARGET_PLATFORM_VERSION}" - VS_GLOBAL_TargetPlatformMinVersion "${TARGET_PLATFORM_MIN_VERSION}" - VS_GLOBAL_WindowsSdkPackageVersion "${WINDOWS_SDK_DOTNET_VERSION}" - VS_GLOBAL_AppendRuntimeIdentifierToOutputPath false - VS_GLOBAL_GenerateAssemblyInfo false - VS_GLOBAL_TargetLatestRuntimePatch false - DOTNET_SDK "Microsoft.NET.Sdk" - DOTNET_TARGET_FRAMEWORK "net8.0-${WINDOWS_TARGET_PLATFORM_VERSION}" - ) -endfunction() \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index 0a831af2e..bd7f0c10f 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -12,16 +12,17 @@ MIT docs\README.MD - + - + - + + diff --git a/nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets similarity index 96% rename from nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets rename to nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets index 0df6a025a..93dbcd0b5 100644 --- a/nuget/Microsoft.WSL.Containers/build/net8.0/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets @@ -26,6 +26,6 @@ - + \ No newline at end of file diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt index d8f3a2694..dc515b437 100644 --- a/src/windows/WslcSDK/csharp/CMakeLists.txt +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -1,4 +1,4 @@ -project(wslcsdkcs LANGUAGES CSharp) +enable_language(CSharp) add_library(wslcsdkcs SHARED "Projection.cs") configure_csharp_target(wslcsdkcs) diff --git a/src/windows/wslsettings/CMakeLists.txt b/src/windows/wslsettings/CMakeLists.txt index 8a1e3b2aa..ef6f04d8a 100644 --- a/src/windows/wslsettings/CMakeLists.txt +++ b/src/windows/wslsettings/CMakeLists.txt @@ -1,6 +1,6 @@ set(TargetApp wslsettings) -configure_csharp_target(${TargetApp}) +enable_language(CSharp) # needed for csharp_set_xaml_cs_properties include(CSharpUtilities) @@ -183,6 +183,8 @@ csharp_set_xaml_cs_properties( Views/Settings/ShellPage.xaml.cs ) +configure_csharp_target(${TargetApp}) + set_property( SOURCE App.xaml PROPERTY VS_XAML_TYPE From 93df6cf41915a3da69eda48dd064902c03a66779 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Wed, 15 Apr 2026 20:35:57 -0700 Subject: [PATCH 03/13] PR comment --- .../native/Microsoft.WSL.Containers.targets | 13 ++++++++-- .../net/Microsoft.WSL.Containers.targets | 24 +++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets index 8f45a9177..222085f75 100644 --- a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets @@ -1,5 +1,10 @@ + + $(Platform) + <_wslcIsInvalidPlatform Condition="'$(WslcPlatform)' != 'x64' and '$(WslcPlatform)' != 'arm64'">true + + @@ -13,13 +18,17 @@ %(AdditionalDependencies) - $(MSBuildThisFileDirectory)..\..\runtimes\win-$(Platform); + $(MSBuildThisFileDirectory)..\..\runtimes\win-$(WslcPlatform); %(AdditionalLibraryDirectories) - + + + + + \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets index 93dbcd0b5..ecc7f902f 100644 --- a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets @@ -5,27 +5,27 @@ - <_wslcSdkPlatform Condition="$(RuntimeIdentifier.EndsWith('-x64'))">x64 - <_wslcSdkPlatform Condition="$(RuntimeIdentifier.EndsWith('-arm64'))">arm64 - <_wslcSdkInvalidPlatformProperty Condition="'$(_wslcSdkPlatform)' == ''">RuntimeIdentifier - <_wslcSdkInvalidPlatform Condition="'$(_wslcSdkPlatform)' == ''">$(RuntimeIdentifier) + <_wslcPlatform Condition="$(RuntimeIdentifier.EndsWith('-x64'))">x64 + <_wslcPlatform Condition="$(RuntimeIdentifier.EndsWith('-arm64'))">arm64 + <_wslcInvalidPlatformProperty Condition="'$(_wslcPlatform)' == ''">RuntimeIdentifier + <_wslcInvalidPlatform Condition="'$(_wslcPlatform)' == ''">$(RuntimeIdentifier) - <_wslcSdkPlatform Condition="'$(PlatformTarget)' == 'x64'">x64 - <_wslcSdkPlatform Condition="'$(PlatformTarget)' == 'arm64'">arm64 - <_wslcSdkInvalidPlatformProperty Condition="'$(_wslcSdkPlatform)' == ''">PlatformTarget - <_wslcSdkInvalidPlatform Condition="'$(_wslcSdkPlatform)' == ''">$(PlatformTarget) + <_wslcPlatform Condition="'$(PlatformTarget)' == 'x64'">x64 + <_wslcPlatform Condition="'$(PlatformTarget)' == 'arm64'">arm64 + <_wslcInvalidPlatformProperty Condition="'$(_wslcPlatform)' == ''">PlatformTarget + <_wslcInvalidPlatform Condition="'$(_wslcPlatform)' == ''">$(PlatformTarget) - - + + - - + + \ No newline at end of file From 7557e2cb6886ada557d757bf6928d23659073f5f Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Thu, 16 Apr 2026 14:03:01 -0700 Subject: [PATCH 04/13] Add solution to comment --- .../build/native/Microsoft.WSL.Containers.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets index 222085f75..abd559faa 100644 --- a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets @@ -29,6 +29,6 @@ - + \ No newline at end of file From 733ea21475730087e390482badba485b2da67101 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Wed, 1 Apr 2026 11:26:28 -0700 Subject: [PATCH 05/13] Add scaffolding for C# projection using C++/WinRT --- CMakeLists.txt | 4 +- cmake/FindIDL.cmake | 52 +++++++++++- nuget/Microsoft.WSL.Containers.nuspec.in | 12 +-- .../net/Microsoft.WSL.Containers.targets | 1 + packages.config | 1 + src/windows/WslcSDK/CMakeLists.txt | 3 + src/windows/WslcSDK/csharp/CMakeLists.txt | 15 +++- src/windows/WslcSDK/csharp/Projection.cs | 8 -- src/windows/WslcSDK/winrt/CMakeLists.txt | 40 +++++++++ src/windows/WslcSDK/winrt/Session.cpp | 42 ++++++++++ src/windows/WslcSDK/winrt/Session.h | 26 ++++++ src/windows/WslcSDK/winrt/SessionSettings.cpp | 84 +++++++++++++++++++ src/windows/WslcSDK/winrt/SessionSettings.h | 42 ++++++++++ src/windows/WslcSDK/winrt/VhdRequirements.cpp | 33 ++++++++ src/windows/WslcSDK/winrt/VhdRequirements.h | 26 ++++++ src/windows/WslcSDK/winrt/precomp.h | 8 ++ src/windows/WslcSDK/winrt/wslcsdk.idl | 59 +++++++++++++ src/windows/WslcSDK/winrt/wslcsdkwinrt.def | 3 + 18 files changed, 442 insertions(+), 17 deletions(-) delete mode 100644 src/windows/WslcSDK/csharp/Projection.cs create mode 100644 src/windows/WslcSDK/winrt/CMakeLists.txt create mode 100644 src/windows/WslcSDK/winrt/Session.cpp create mode 100644 src/windows/WslcSDK/winrt/Session.h create mode 100644 src/windows/WslcSDK/winrt/SessionSettings.cpp create mode 100644 src/windows/WslcSDK/winrt/SessionSettings.h create mode 100644 src/windows/WslcSDK/winrt/VhdRequirements.cpp create mode 100644 src/windows/WslcSDK/winrt/VhdRequirements.h create mode 100644 src/windows/WslcSDK/winrt/precomp.h create mode 100644 src/windows/WslcSDK/winrt/wslcsdk.idl create mode 100644 src/windows/WslcSDK/winrt/wslcsdkwinrt.def diff --git a/CMakeLists.txt b/CMakeLists.txt index ffb07b12b..a81bb771e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,9 @@ find_nuget_package(Microsoft.Windows.SDK.NET.Ref WINDOWS_SDK_DOTNET /) find_nuget_package(Microsoft.Xaml.Behaviors.WinUI.Managed XAML_BEHAVIORS /) find_nuget_package(WinUIEx WINUIEX /) +# WSLC C# API packages +find_nuget_package(Microsoft.Windows.CsWinRT CSWINRT /) + set(WSLG_TS_PLUGIN_DLL "WSLDVCPlugin.dll") # Default to debug build if unspecified @@ -496,7 +499,6 @@ add_subdirectory(src/windows/wslrelay) add_subdirectory(src/windows/wslinstall) add_subdirectory(src/windows/wslc) add_subdirectory(src/windows/WslcSDK) -add_subdirectory(src/windows/WslcSDK/csharp) if (WSL_BUILD_WSL_SETTINGS) add_subdirectory(src/windows/libwsl) diff --git a/cmake/FindIDL.cmake b/cmake/FindIDL.cmake index ac3965ec6..c9dc6e79f 100644 --- a/cmake/FindIDL.cmake +++ b/cmake/FindIDL.cmake @@ -81,4 +81,54 @@ function(add_idl target idl_files_with_proxy idl_files_no_proxy) DEPENDS ${TARGET_OUTPUTS} SOURCES ${idl_files_with_proxy} ${idl_files_no_proxy}) -endfunction() \ No newline at end of file +endfunction() + +function(add_idl_winrt target idl_files) + set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}) + cmake_path(NATIVE_PATH OUTPUT_DIR OUTPUT_DIR) + file(MAKE_DIRECTORY ${OUTPUT_DIR}) + set(TARGET_OUTPUTS) + + set(IDL_DEFINITIONS "") + + get_directory_property(IDL_DEFS COMPILE_DEFINITIONS ) + foreach(e ${IDL_DEFS}) + set(IDL_DEFINITIONS ${IDL_DEFINITIONS} /D${e}) + endforeach() + + string(TOLOWER ${TARGET_PLATFORM} IDL_ENV) + + cmake_host_system_information( + RESULT WINDOWS_SDK_DIR + QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Microsoft/Windows Kits/Installed Roots" + VALUE "KitsRoot10") + set(WINRT_METADATA_DIR "${WINDOWS_SDK_DIR}\\UnionMetadata\\${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") + set(WINRT_REFERENCE "${WINRT_METADATA_DIR}\\Windows.winmd") + set(WINRT_INCLUDE "${WINDOWS_SDK_DIR}\\Include\\${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}\\winrt") + + + foreach(idl_file ${idl_files}) + + cmake_path(GET idl_file STEM IDL_NAME) + + set(IDL_WINMD ${OUTPUT_DIR}/${IDL_NAME}.winmd) + + add_custom_command( + OUTPUT ${IDL_WINMD} ${CMAKE_CURRENT_BINARY_DIR}/CmakeFiles/${target} + COMMAND midl /nologo /nomidl /winrt /metadata_dir "${WINRT_METADATA_DIR}" /reference "${WINRT_REFERENCE}" /I "${WINRT_INCLUDE}" /env "${IDL_ENV}" /h nul /winmd ${IDL_WINMD} ${idl_file} ${IDL_DEFINITIONS} + COMMAND cppwinrt -input ${IDL_WINMD} -reference "${WINRT_REFERENCE}" -output ${OUTPUT_DIR} -comp ${OUTPUT_DIR}/implementation_base -optimize -pch precomp.h -prefix + COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_CURRENT_BINARY_DIR}/CmakeFiles/${target}" + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + DEPENDS ${idl_file} + MAIN_DEPENDENCY ${idl_file} + VERBATIM + ) + + set_source_files_properties(${IDL_WINMD} PROPERTIES GENERATED TRUE) + list(APPEND TARGET_OUTPUTS ${IDL_WINMD}) + + endforeach() + + add_custom_target(${target} DEPENDS ${TARGET_OUTPUTS} SOURCES ${idl_file}) + +endfunction() diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index bd7f0c10f..0aa21d402 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -17,11 +17,13 @@ - - - - - + + + + + + + diff --git a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets index ecc7f902f..f81b2c9ac 100644 --- a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets @@ -21,6 +21,7 @@ + diff --git a/packages.config b/packages.config index bc5319129..e2123830b 100644 --- a/packages.config +++ b/packages.config @@ -12,6 +12,7 @@ + diff --git a/src/windows/WslcSDK/CMakeLists.txt b/src/windows/WslcSDK/CMakeLists.txt index cbb0e059d..f57649561 100644 --- a/src/windows/WslcSDK/CMakeLists.txt +++ b/src/windows/WslcSDK/CMakeLists.txt @@ -19,3 +19,6 @@ add_dependencies(wslcsdk wslserviceidl) target_link_libraries(wslcsdk ${COMMON_LINK_LIBRARIES} legacy_stdio_definitions common) target_precompile_headers(wslcsdk REUSE_FROM common) set_target_properties(wslcsdk PROPERTIES FOLDER windows) + +add_subdirectory(winrt) +add_subdirectory(csharp) \ No newline at end of file diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt index dc515b437..cb7afe986 100644 --- a/src/windows/WslcSDK/csharp/CMakeLists.txt +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -1,13 +1,24 @@ enable_language(CSharp) -add_library(wslcsdkcs SHARED "Projection.cs") +add_library(wslcsdkcs SHARED) configure_csharp_target(wslcsdkcs) +set(WSLCSDK_WINMD "${CMAKE_CURRENT_SOURCE_DIR}/../winrt/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/wslcsdk.winmd") +target_sources(wslcsdkcs PRIVATE "${WSLCSDK_WINMD}") +set_source_files_properties( + "${WSLCSDK_WINMD}" + PROPERTIES + GENERATED TRUE + VS_TOOL_OVERRIDE "CsWinRTInputs" +) + set_target_properties( wslcsdkcs PROPERTIES FOLDER windows LINKER_LANGUAGE CSharp VS_GLOBAL_PlatformTarget "AnyCPU" + VS_PACKAGE_REFERENCES "Microsoft.Windows.CsWinRT_${CSWINRT_VERSION}" + VS_GLOBAL_CsWinRTIncludes "Microsoft.WSL.Containers" ) -add_dependencies(wslcsdkcs wslcsdk) +add_dependencies(wslcsdkcs wslcsdkwinrt) diff --git a/src/windows/WslcSDK/csharp/Projection.cs b/src/windows/WslcSDK/csharp/Projection.cs deleted file mode 100644 index 96fe29c91..000000000 --- a/src/windows/WslcSDK/csharp/Projection.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.WSL.Containers -{ - // This is only a placeholder so that we can compile a DLL. - // The actual implementation of the projection will be added later. - internal class Projection - { - } -} \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/CMakeLists.txt b/src/windows/WslcSDK/winrt/CMakeLists.txt new file mode 100644 index 000000000..c7c4dd5d7 --- /dev/null +++ b/src/windows/WslcSDK/winrt/CMakeLists.txt @@ -0,0 +1,40 @@ +add_idl_winrt(wslcsdkwinrtidl "wslcsdk.idl") +set_target_properties(wslcsdkwinrtidl PROPERTIES FOLDER windows) + +set(SOURCES + Session.cpp + SessionSettings.cpp + VhdRequirements.cpp +) + +set(HEADERS + Session.h + SessionSettings.h + VhdRequirements.h +) + +add_library(wslcsdkwinrt SHARED ${SOURCES} ${HEADERS}) +add_dependencies(wslcsdkwinrt wslcsdk wslcsdkwinrtidl) + +set(MODULE_G_CPP ${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/module.g.cpp) +target_sources(wslcsdkwinrt PRIVATE ${MODULE_G_CPP}) +set_source_files_properties( + ${MODULE_G_CPP} + PROPERTIES + GENERATED TRUE) + +target_precompile_headers(wslcsdkwinrt PRIVATE precomp.h) +target_include_directories(wslcsdkwinrt PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE} + ${CMAKE_SOURCE_DIR}/src/windows/WslcSDK +) + +target_link_options(wslcsdkwinrt PRIVATE /DEF:${CMAKE_CURRENT_SOURCE_DIR}/wslcsdkwinrt.def) +target_link_libraries(wslcsdkwinrt ${COMMON_LINK_LIBRARIES} wslcsdk) + +set_target_properties( + wslcsdkwinrt + PROPERTIES + FOLDER windows + EXCLUDE_FROM_ALL FALSE +) diff --git a/src/windows/WslcSDK/winrt/Session.cpp b/src/windows/WslcSDK/winrt/Session.cpp new file mode 100644 index 000000000..72f58e0db --- /dev/null +++ b/src/windows/WslcSDK/winrt/Session.cpp @@ -0,0 +1,42 @@ +#include "precomp.h" + +#include "Session.h" +#include "Microsoft.WSL.Containers.Session.g.cpp" + +namespace WSLC = winrt::Microsoft::WSL::Containers; + +namespace winrt::Microsoft::WSL::Containers { + +implementation::Session::~Session() +{ + winrt::check_hresult(WslcReleaseSession(m_session)); +} + +WSLC::Session implementation::Session::Create(WSLC::SessionSettings const& settings) +{ + auto session = winrt::make_self(); + wil::unique_cotaskmem_string errorMessage; + auto hr = WslcCreateSession( + winrt::get_self(settings)->ToStructPointer(), session->ToHandlePointer(), &errorMessage); + if (FAILED(hr)) + { + throw winrt::hresult_error(hr, winrt::to_hstring(errorMessage.get())); + } + return *session; +} + +void implementation::Session::Terminate() +{ + winrt::check_hresult(WslcTerminateSession(m_session)); +} + +WslcSession implementation::Session::ToHandle() +{ + return m_session; +} + +WslcSession* implementation::Session::ToHandlePointer() +{ + return &m_session; +} +} // namespace winrt::Microsoft::WSL::Containers diff --git a/src/windows/WslcSDK/winrt/Session.h b/src/windows/WslcSDK/winrt/Session.h new file mode 100644 index 000000000..f9c493d8f --- /dev/null +++ b/src/windows/WslcSDK/winrt/Session.h @@ -0,0 +1,26 @@ +#pragma once +#include "Microsoft.WSL.Containers.Session.g.h" +#include "SessionSettings.h" + +namespace winrt::Microsoft::WSL::Containers::implementation { +struct Session : SessionT +{ + Session() = default; + ~Session(); + + static winrt::Microsoft::WSL::Containers::Session Create(winrt::Microsoft::WSL::Containers::SessionSettings const& settings); + void Terminate(); + + WslcSession ToHandle(); + WslcSession* ToHandlePointer(); + +private: + WslcSession m_session; +}; +} // namespace winrt::Microsoft::WSL::Containers::implementation + +namespace winrt::Microsoft::WSL::Containers::factory_implementation { +struct Session : SessionT +{ +}; +} // namespace winrt::Microsoft::WSL::Containers::factory_implementation diff --git a/src/windows/WslcSDK/winrt/SessionSettings.cpp b/src/windows/WslcSDK/winrt/SessionSettings.cpp new file mode 100644 index 000000000..e575a1ed5 --- /dev/null +++ b/src/windows/WslcSDK/winrt/SessionSettings.cpp @@ -0,0 +1,84 @@ +#include "precomp.h" +#include "SessionSettings.h" +#include "Microsoft.WSL.Containers.SessionSettings.g.cpp" + +namespace WSLC = winrt::Microsoft::WSL::Containers; + +namespace winrt::Microsoft::WSL::Containers { +implementation::SessionSettings::SessionSettings(hstring const& name, hstring const& storagePath) : + m_name(name), m_storagePath(storagePath) +{ + winrt::check_hresult(WslcInitSessionSettings(m_name.c_str(), m_storagePath.c_str(), &m_sessionSettings)); +} + +hstring implementation::SessionSettings::Name() +{ + return hstring{m_name}; +} + +hstring implementation::SessionSettings::StoragePath() +{ + return hstring{m_storagePath}; +} + +uint32_t implementation::SessionSettings::CpuCount() +{ + return m_cpuCount; +} + +void implementation::SessionSettings::CpuCount(uint32_t value) +{ + m_cpuCount = value; + winrt::check_hresult(WslcSetSessionSettingsCpuCount(&m_sessionSettings, m_cpuCount)); +} + +uint32_t implementation::SessionSettings::MemoryMb() +{ + return m_memoryMb; +} + +void implementation::SessionSettings::MemoryMb(uint32_t value) +{ + m_memoryMb = value; + winrt::check_hresult(WslcSetSessionSettingsMemory(&m_sessionSettings, m_memoryMb)); +} + +uint32_t implementation::SessionSettings::TimeoutMS() +{ + return m_timeoutMS; +} + +void implementation::SessionSettings::TimeoutMS(uint32_t value) +{ + m_timeoutMS = value; + winrt::check_hresult(WslcSetSessionSettingsTimeout(&m_sessionSettings, m_timeoutMS)); +} + +WSLC::VhdRequirements implementation::SessionSettings::VhdRequirements() +{ + return m_vhdRequirements; +} + +void implementation::SessionSettings::VhdRequirements(WSLC::VhdRequirements const& value) +{ + m_vhdRequirements = value; + winrt::check_hresult(WslcSetSessionSettingsVhd( + &m_sessionSettings, winrt::get_self(m_vhdRequirements)->ToStructPointer())); +} + +WSLC::SessionFeatureFlags implementation::SessionSettings::FeatureFlags() +{ + return m_featureFlags; +} + +void implementation::SessionSettings::FeatureFlags(WSLC::SessionFeatureFlags const& value) +{ + m_featureFlags = value; + winrt::check_hresult(WslcSetSessionSettingsFeatureFlags(&m_sessionSettings, static_cast(m_featureFlags))); +} + +WslcSessionSettings* implementation::SessionSettings::ToStructPointer() +{ + return &m_sessionSettings; +} +} // namespace winrt::Microsoft::WSL::Containers diff --git a/src/windows/WslcSDK/winrt/SessionSettings.h b/src/windows/WslcSDK/winrt/SessionSettings.h new file mode 100644 index 000000000..aac823c9e --- /dev/null +++ b/src/windows/WslcSDK/winrt/SessionSettings.h @@ -0,0 +1,42 @@ +#pragma once +#include "Microsoft.WSL.Containers.SessionSettings.g.h" +#include "VhdRequirements.h" + +namespace winrt::Microsoft::WSL::Containers::implementation { +struct SessionSettings : SessionSettingsT +{ + SessionSettings() = default; + + SessionSettings(hstring const& name, hstring const& storagePath); + hstring Name(); + hstring StoragePath(); + uint32_t CpuCount(); + void CpuCount(uint32_t value); + uint32_t MemoryMb(); + void MemoryMb(uint32_t value); + uint32_t TimeoutMS(); + void TimeoutMS(uint32_t value); + winrt::Microsoft::WSL::Containers::VhdRequirements VhdRequirements(); + void VhdRequirements(winrt::Microsoft::WSL::Containers::VhdRequirements const& value); + winrt::Microsoft::WSL::Containers::SessionFeatureFlags FeatureFlags(); + void FeatureFlags(winrt::Microsoft::WSL::Containers::SessionFeatureFlags const& value); + + WslcSessionSettings* ToStructPointer(); + +private: + WslcSessionSettings m_sessionSettings; + std::wstring m_name; + std::wstring m_storagePath; + uint32_t m_cpuCount; + uint32_t m_memoryMb; + uint32_t m_timeoutMS; + winrt::Microsoft::WSL::Containers::VhdRequirements m_vhdRequirements{nullptr}; + winrt::Microsoft::WSL::Containers::SessionFeatureFlags m_featureFlags; +}; +} // namespace winrt::Microsoft::WSL::Containers::implementation + +namespace winrt::Microsoft::WSL::Containers::factory_implementation { +struct SessionSettings : SessionSettingsT +{ +}; +} // namespace winrt::Microsoft::WSL::Containers::factory_implementation \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/VhdRequirements.cpp b/src/windows/WslcSDK/winrt/VhdRequirements.cpp new file mode 100644 index 000000000..1953d1b99 --- /dev/null +++ b/src/windows/WslcSDK/winrt/VhdRequirements.cpp @@ -0,0 +1,33 @@ +#include "precomp.h" +#include "VhdRequirements.h" +#include "Microsoft.WSL.Containers.VhdRequirements.g.cpp" + +namespace winrt::Microsoft::WSL::Containers::implementation { +VhdRequirements::VhdRequirements(hstring const& name, uint64_t sizeInBytes, winrt::Microsoft::WSL::Containers::VhdType const& type) : + m_name(winrt::to_string(name)) +{ + m_vhdRequirements.name = m_name.c_str(); + m_vhdRequirements.sizeInBytes = sizeInBytes; + m_vhdRequirements.type = static_cast(type); +} + +hstring VhdRequirements::Name() +{ + return winrt::to_hstring(m_name); +} + +uint64_t VhdRequirements::SizeInBytes() +{ + return m_vhdRequirements.sizeInBytes; +} + +winrt::Microsoft::WSL::Containers::VhdType VhdRequirements::Type() +{ + return static_cast(m_vhdRequirements.type); +} + +WslcVhdRequirements* VhdRequirements::ToStructPointer() +{ + return &m_vhdRequirements; +} +} // namespace winrt::Microsoft::WSL::Containers::implementation \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/VhdRequirements.h b/src/windows/WslcSDK/winrt/VhdRequirements.h new file mode 100644 index 000000000..83be24b4e --- /dev/null +++ b/src/windows/WslcSDK/winrt/VhdRequirements.h @@ -0,0 +1,26 @@ +#pragma once +#include "Microsoft.WSL.Containers.VhdRequirements.g.h" + +namespace winrt::Microsoft::WSL::Containers::implementation { +struct VhdRequirements : VhdRequirementsT +{ + VhdRequirements() = default; + + VhdRequirements(hstring const& name, uint64_t sizeInBytes, winrt::Microsoft::WSL::Containers::VhdType const& type); + hstring Name(); + uint64_t SizeInBytes(); + winrt::Microsoft::WSL::Containers::VhdType Type(); + + WslcVhdRequirements* ToStructPointer(); + +private: + std::string m_name; + WslcVhdRequirements m_vhdRequirements{nullptr}; +}; +} // namespace winrt::Microsoft::WSL::Containers::implementation + +namespace winrt::Microsoft::WSL::Containers::factory_implementation { +struct VhdRequirements : VhdRequirementsT +{ +}; +} // namespace winrt::Microsoft::WSL::Containers::factory_implementation \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/precomp.h b/src/windows/WslcSDK/winrt/precomp.h new file mode 100644 index 000000000..8d78e9c92 --- /dev/null +++ b/src/windows/WslcSDK/winrt/precomp.h @@ -0,0 +1,8 @@ +#pragma once + +#include "wslcsdk.h" + +#include +#include + +#include diff --git a/src/windows/WslcSDK/winrt/wslcsdk.idl b/src/windows/WslcSDK/winrt/wslcsdk.idl new file mode 100644 index 000000000..d2b8befdb --- /dev/null +++ b/src/windows/WslcSDK/winrt/wslcsdk.idl @@ -0,0 +1,59 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + wslcsdk.idl + +Abstract: + + This file contains the definition of a WinRT projection of the WSL Container SDK API. + +--*/ + +namespace Microsoft.WSL.Containers +{ + runtimeclass SessionSettings + { + SessionSettings(String name, String storagePath); + + String Name { get; }; + String StoragePath { get; }; + + UInt32 CpuCount { get; set; }; + UInt32 MemoryMb { get; set; }; + UInt32 TimeoutMS { get; set; }; + VhdRequirements VhdRequirements { get; set; }; + SessionFeatureFlags FeatureFlags { get; set; }; + }; + + runtimeclass Session + { + static Session Create(SessionSettings settings); + + void Terminate(); + }; + + [flags] + enum SessionFeatureFlags + { + None = 0x00000000, + EnableGpu = 0x00000004 + }; + + enum VhdType + { + Dynamic = 0, + Fixed = 1, + }; + + runtimeclass VhdRequirements + { + VhdRequirements(String name, UInt64 sizeInBytes, VhdType type); + + String Name { get; }; + UInt64 SizeInBytes { get; }; + VhdType Type { get; }; + }; +} \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/wslcsdkwinrt.def b/src/windows/WslcSDK/winrt/wslcsdkwinrt.def new file mode 100644 index 000000000..4177cdd70 --- /dev/null +++ b/src/windows/WslcSDK/winrt/wslcsdkwinrt.def @@ -0,0 +1,3 @@ +EXPORTS + DllGetActivationFactory = WINRT_GetActivationFactory PRIVATE + DllCanUnloadNow = WINRT_CanUnloadNow PRIVATE From 1f679932772c558e95f0c616f4fb9f1185eaee76 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Thu, 16 Apr 2026 16:25:36 -0700 Subject: [PATCH 06/13] Copilot comments --- cmake/FindIDL.cmake | 41 +++++------- src/windows/WslcSDK/csharp/CMakeLists.txt | 2 +- src/windows/WslcSDK/winrt/CMakeLists.txt | 5 +- src/windows/WslcSDK/winrt/Helpers.h | 67 +++++++++++++++++++ src/windows/WslcSDK/winrt/Session.cpp | 14 ++-- src/windows/WslcSDK/winrt/Session.h | 5 +- src/windows/WslcSDK/winrt/SessionSettings.cpp | 5 +- src/windows/WslcSDK/winrt/SessionSettings.h | 15 +++-- src/windows/WslcSDK/winrt/VhdRequirements.h | 5 +- 9 files changed, 116 insertions(+), 43 deletions(-) create mode 100644 src/windows/WslcSDK/winrt/Helpers.h diff --git a/cmake/FindIDL.cmake b/cmake/FindIDL.cmake index c9dc6e79f..b3a824731 100644 --- a/cmake/FindIDL.cmake +++ b/cmake/FindIDL.cmake @@ -83,11 +83,10 @@ function(add_idl target idl_files_with_proxy idl_files_no_proxy) endfunction() -function(add_idl_winrt target idl_files) +function(add_idl_winrt target idl_file) set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}) - cmake_path(NATIVE_PATH OUTPUT_DIR OUTPUT_DIR) + cmake_path(NATIVE_PATH OUTPUT_DIR OUTPUT_DIR) # midl is picky about path formats file(MAKE_DIRECTORY ${OUTPUT_DIR}) - set(TARGET_OUTPUTS) set(IDL_DEFINITIONS "") @@ -106,29 +105,25 @@ function(add_idl_winrt target idl_files) set(WINRT_REFERENCE "${WINRT_METADATA_DIR}\\Windows.winmd") set(WINRT_INCLUDE "${WINDOWS_SDK_DIR}\\Include\\${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}\\winrt") + cmake_path(GET idl_file STEM IDL_NAME) - foreach(idl_file ${idl_files}) - - cmake_path(GET idl_file STEM IDL_NAME) - - set(IDL_WINMD ${OUTPUT_DIR}/${IDL_NAME}.winmd) - - add_custom_command( - OUTPUT ${IDL_WINMD} ${CMAKE_CURRENT_BINARY_DIR}/CmakeFiles/${target} - COMMAND midl /nologo /nomidl /winrt /metadata_dir "${WINRT_METADATA_DIR}" /reference "${WINRT_REFERENCE}" /I "${WINRT_INCLUDE}" /env "${IDL_ENV}" /h nul /winmd ${IDL_WINMD} ${idl_file} ${IDL_DEFINITIONS} - COMMAND cppwinrt -input ${IDL_WINMD} -reference "${WINRT_REFERENCE}" -output ${OUTPUT_DIR} -comp ${OUTPUT_DIR}/implementation_base -optimize -pch precomp.h -prefix - COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_CURRENT_BINARY_DIR}/CmakeFiles/${target}" - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - DEPENDS ${idl_file} - MAIN_DEPENDENCY ${idl_file} - VERBATIM - ) + set(IDL_WINMD ${OUTPUT_DIR}/${IDL_NAME}.winmd) - set_source_files_properties(${IDL_WINMD} PROPERTIES GENERATED TRUE) - list(APPEND TARGET_OUTPUTS ${IDL_WINMD}) + add_custom_command( + OUTPUT ${IDL_WINMD} + COMMAND midl /nologo /nomidl /winrt /metadata_dir "${WINRT_METADATA_DIR}" /reference "${WINRT_REFERENCE}" /I "${WINRT_INCLUDE}" /env "${IDL_ENV}" /h nul /winmd ${IDL_WINMD} ${idl_file} ${IDL_DEFINITIONS} + COMMAND cppwinrt -input ${IDL_WINMD} -reference "${WINRT_REFERENCE}" -output ${OUTPUT_DIR} -comp ${OUTPUT_DIR}/implementation_base -optimize -pch precomp.h -prefix + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + DEPENDS ${idl_file} + MAIN_DEPENDENCY ${idl_file} + VERBATIM + ) - endforeach() + set_source_files_properties(${IDL_WINMD} PROPERTIES GENERATED TRUE) - add_custom_target(${target} DEPENDS ${TARGET_OUTPUTS} SOURCES ${idl_file}) + add_custom_target(${target} + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target} + DEPENDS ${IDL_WINMD} + SOURCES ${idl_file}) endfunction() diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt index cb7afe986..a2661bee9 100644 --- a/src/windows/WslcSDK/csharp/CMakeLists.txt +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -3,7 +3,7 @@ enable_language(CSharp) add_library(wslcsdkcs SHARED) configure_csharp_target(wslcsdkcs) -set(WSLCSDK_WINMD "${CMAKE_CURRENT_SOURCE_DIR}/../winrt/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/wslcsdk.winmd") +set(WSLCSDK_WINMD "${CMAKE_CURRENT_BINARY_DIR}/../winrt/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/wslcsdk.winmd") target_sources(wslcsdkcs PRIVATE "${WSLCSDK_WINMD}") set_source_files_properties( "${WSLCSDK_WINMD}" diff --git a/src/windows/WslcSDK/winrt/CMakeLists.txt b/src/windows/WslcSDK/winrt/CMakeLists.txt index c7c4dd5d7..d409a7f91 100644 --- a/src/windows/WslcSDK/winrt/CMakeLists.txt +++ b/src/windows/WslcSDK/winrt/CMakeLists.txt @@ -8,6 +8,7 @@ set(SOURCES ) set(HEADERS + Helpers.h Session.h SessionSettings.h VhdRequirements.h @@ -16,7 +17,7 @@ set(HEADERS add_library(wslcsdkwinrt SHARED ${SOURCES} ${HEADERS}) add_dependencies(wslcsdkwinrt wslcsdk wslcsdkwinrtidl) -set(MODULE_G_CPP ${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/module.g.cpp) +set(MODULE_G_CPP ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/module.g.cpp) target_sources(wslcsdkwinrt PRIVATE ${MODULE_G_CPP}) set_source_files_properties( ${MODULE_G_CPP} @@ -25,7 +26,7 @@ set_source_files_properties( target_precompile_headers(wslcsdkwinrt PRIVATE precomp.h) target_include_directories(wslcsdkwinrt PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE} + ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE} ${CMAKE_SOURCE_DIR}/src/windows/WslcSDK ) diff --git a/src/windows/WslcSDK/winrt/Helpers.h b/src/windows/WslcSDK/winrt/Helpers.h new file mode 100644 index 000000000..8427154ff --- /dev/null +++ b/src/windows/WslcSDK/winrt/Helpers.h @@ -0,0 +1,67 @@ +#pragma once + +#define THROW_MSG_IF_FAILED(hr, msg) \ + do \ + { \ + auto _hr = (hr); \ + if (FAILED(_hr)) \ + { \ + auto _msg = (msg).get(); \ + if (!_msg) \ + { \ + throw winrt::hresult_error(_hr); \ + } \ + else \ + { \ + throw winrt::hresult_error(_hr, winrt::to_hstring(_msg)); \ + } \ + } \ + } while (0) + +template +struct implementation_type; + +#define DEFINE_TYPE_HELPERS(__type__) \ + template <> \ + struct implementation_type \ + { \ + using type = winrt::Microsoft::WSL::Containers::implementation::__type__; \ + }; + +namespace winrt::Microsoft::WSL::Containers::implementation { +template +auto* GetStructPointer(const T& obj) +{ + return obj ? winrt::get_self::type>(obj)->ToStructPointer() : nullptr; +} + +template +auto* GetHandlePointer(const T& obj) +{ + return obj ? winrt::get_self::type>(obj)->ToHandlePointer() : nullptr; +} + +template +auto GetHandle(const T& obj) +{ + return obj ? winrt::get_self::type>(obj)->ToHandle() : nullptr; +} + +template +auto* GetStructPointer(const winrt::com_ptr& obj) +{ + return obj ? obj->ToStructPointer() : nullptr; +} + +template +auto* GetHandlePointer(const winrt::com_ptr& obj) +{ + return obj ? obj->ToHandlePointer() : nullptr; +} + +template +auto GetHandle(const winrt::com_ptr& obj) +{ + return obj ? obj->ToHandle() : nullptr; +} +} // namespace winrt::Microsoft::WSL::Containers::implementation \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/Session.cpp b/src/windows/WslcSDK/winrt/Session.cpp index 72f58e0db..6ec67f4ec 100644 --- a/src/windows/WslcSDK/winrt/Session.cpp +++ b/src/windows/WslcSDK/winrt/Session.cpp @@ -9,19 +9,19 @@ namespace winrt::Microsoft::WSL::Containers { implementation::Session::~Session() { - winrt::check_hresult(WslcReleaseSession(m_session)); + if (m_session) + { + WslcReleaseSession(m_session); + m_session = nullptr; + } } WSLC::Session implementation::Session::Create(WSLC::SessionSettings const& settings) { auto session = winrt::make_self(); wil::unique_cotaskmem_string errorMessage; - auto hr = WslcCreateSession( - winrt::get_self(settings)->ToStructPointer(), session->ToHandlePointer(), &errorMessage); - if (FAILED(hr)) - { - throw winrt::hresult_error(hr, winrt::to_hstring(errorMessage.get())); - } + auto hr = WslcCreateSession(implementation::GetStructPointer(settings), implementation::GetHandlePointer(session), &errorMessage); + THROW_MSG_IF_FAILED(hr, errorMessage); return *session; } diff --git a/src/windows/WslcSDK/winrt/Session.h b/src/windows/WslcSDK/winrt/Session.h index f9c493d8f..815ec623d 100644 --- a/src/windows/WslcSDK/winrt/Session.h +++ b/src/windows/WslcSDK/winrt/Session.h @@ -1,6 +1,7 @@ #pragma once #include "Microsoft.WSL.Containers.Session.g.h" #include "SessionSettings.h" +#include "Helpers.h" namespace winrt::Microsoft::WSL::Containers::implementation { struct Session : SessionT @@ -15,7 +16,7 @@ struct Session : SessionT WslcSession* ToHandlePointer(); private: - WslcSession m_session; + WslcSession m_session{nullptr}; }; } // namespace winrt::Microsoft::WSL::Containers::implementation @@ -24,3 +25,5 @@ struct Session : SessionT { }; } // namespace winrt::Microsoft::WSL::Containers::factory_implementation + +DEFINE_TYPE_HELPERS(Session); \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/SessionSettings.cpp b/src/windows/WslcSDK/winrt/SessionSettings.cpp index e575a1ed5..66776d92b 100644 --- a/src/windows/WslcSDK/winrt/SessionSettings.cpp +++ b/src/windows/WslcSDK/winrt/SessionSettings.cpp @@ -62,8 +62,9 @@ WSLC::VhdRequirements implementation::SessionSettings::VhdRequirements() void implementation::SessionSettings::VhdRequirements(WSLC::VhdRequirements const& value) { m_vhdRequirements = value; - winrt::check_hresult(WslcSetSessionSettingsVhd( - &m_sessionSettings, winrt::get_self(m_vhdRequirements)->ToStructPointer())); + auto vhdRequirements = + m_vhdRequirements ? winrt::get_self(m_vhdRequirements)->ToStructPointer() : nullptr; + winrt::check_hresult(WslcSetSessionSettingsVhd(&m_sessionSettings, vhdRequirements)); } WSLC::SessionFeatureFlags implementation::SessionSettings::FeatureFlags() diff --git a/src/windows/WslcSDK/winrt/SessionSettings.h b/src/windows/WslcSDK/winrt/SessionSettings.h index aac823c9e..c7a36ec3c 100644 --- a/src/windows/WslcSDK/winrt/SessionSettings.h +++ b/src/windows/WslcSDK/winrt/SessionSettings.h @@ -1,6 +1,7 @@ #pragma once #include "Microsoft.WSL.Containers.SessionSettings.g.h" #include "VhdRequirements.h" +#include "Helpers.h" namespace winrt::Microsoft::WSL::Containers::implementation { struct SessionSettings : SessionSettingsT @@ -24,14 +25,14 @@ struct SessionSettings : SessionSettingsT WslcSessionSettings* ToStructPointer(); private: - WslcSessionSettings m_sessionSettings; + WslcSessionSettings m_sessionSettings{}; std::wstring m_name; std::wstring m_storagePath; - uint32_t m_cpuCount; - uint32_t m_memoryMb; - uint32_t m_timeoutMS; + uint32_t m_cpuCount{2}; + uint32_t m_memoryMb{2000}; + uint32_t m_timeoutMS{30000}; winrt::Microsoft::WSL::Containers::VhdRequirements m_vhdRequirements{nullptr}; - winrt::Microsoft::WSL::Containers::SessionFeatureFlags m_featureFlags; + winrt::Microsoft::WSL::Containers::SessionFeatureFlags m_featureFlags{winrt::Microsoft::WSL::Containers::SessionFeatureFlags::None}; }; } // namespace winrt::Microsoft::WSL::Containers::implementation @@ -39,4 +40,6 @@ namespace winrt::Microsoft::WSL::Containers::factory_implementation { struct SessionSettings : SessionSettingsT { }; -} // namespace winrt::Microsoft::WSL::Containers::factory_implementation \ No newline at end of file +} // namespace winrt::Microsoft::WSL::Containers::factory_implementation + +DEFINE_TYPE_HELPERS(SessionSettings); \ No newline at end of file diff --git a/src/windows/WslcSDK/winrt/VhdRequirements.h b/src/windows/WslcSDK/winrt/VhdRequirements.h index 83be24b4e..41a0e1373 100644 --- a/src/windows/WslcSDK/winrt/VhdRequirements.h +++ b/src/windows/WslcSDK/winrt/VhdRequirements.h @@ -1,5 +1,6 @@ #pragma once #include "Microsoft.WSL.Containers.VhdRequirements.g.h" +#include "Helpers.h" namespace winrt::Microsoft::WSL::Containers::implementation { struct VhdRequirements : VhdRequirementsT @@ -23,4 +24,6 @@ namespace winrt::Microsoft::WSL::Containers::factory_implementation { struct VhdRequirements : VhdRequirementsT { }; -} // namespace winrt::Microsoft::WSL::Containers::factory_implementation \ No newline at end of file +} // namespace winrt::Microsoft::WSL::Containers::factory_implementation + +DEFINE_TYPE_HELPERS(VhdRequirements); \ No newline at end of file From 17f7b84bd7752f5f0758eab00ba68e5342068fe1 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Fri, 17 Apr 2026 16:09:33 -0700 Subject: [PATCH 07/13] Copyright headers --- src/windows/WslcSDK/winrt/Helpers.h | 14 ++++++++++++++ src/windows/WslcSDK/winrt/Session.cpp | 14 ++++++++++++++ src/windows/WslcSDK/winrt/Session.h | 14 ++++++++++++++ src/windows/WslcSDK/winrt/SessionSettings.cpp | 14 ++++++++++++++ src/windows/WslcSDK/winrt/SessionSettings.h | 14 ++++++++++++++ src/windows/WslcSDK/winrt/VhdRequirements.cpp | 14 ++++++++++++++ src/windows/WslcSDK/winrt/VhdRequirements.h | 14 ++++++++++++++ src/windows/WslcSDK/winrt/precomp.h | 14 ++++++++++++++ 8 files changed, 112 insertions(+) diff --git a/src/windows/WslcSDK/winrt/Helpers.h b/src/windows/WslcSDK/winrt/Helpers.h index 8427154ff..2b87192a1 100644 --- a/src/windows/WslcSDK/winrt/Helpers.h +++ b/src/windows/WslcSDK/winrt/Helpers.h @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + Helpers.h + +Abstract: + + This file contains helpers for the WinRT wrapper of WSLC SDK. + +--*/ + #pragma once #define THROW_MSG_IF_FAILED(hr, msg) \ diff --git a/src/windows/WslcSDK/winrt/Session.cpp b/src/windows/WslcSDK/winrt/Session.cpp index 6ec67f4ec..daf4894f6 100644 --- a/src/windows/WslcSDK/winrt/Session.cpp +++ b/src/windows/WslcSDK/winrt/Session.cpp @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + Session.cpp + +Abstract: + + This file contains the implementation of the WinRT wrapper for the WSLC SDK Session class. + +--*/ + #include "precomp.h" #include "Session.h" diff --git a/src/windows/WslcSDK/winrt/Session.h b/src/windows/WslcSDK/winrt/Session.h index 815ec623d..a6d1c6b0e 100644 --- a/src/windows/WslcSDK/winrt/Session.h +++ b/src/windows/WslcSDK/winrt/Session.h @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + Session.h + +Abstract: + + This file contains the definition of the WinRT wrapper for the WSLC SDK Session class. + +--*/ + #pragma once #include "Microsoft.WSL.Containers.Session.g.h" #include "SessionSettings.h" diff --git a/src/windows/WslcSDK/winrt/SessionSettings.cpp b/src/windows/WslcSDK/winrt/SessionSettings.cpp index 66776d92b..33aca61b2 100644 --- a/src/windows/WslcSDK/winrt/SessionSettings.cpp +++ b/src/windows/WslcSDK/winrt/SessionSettings.cpp @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + SessionSettings.cpp + +Abstract: + + This file contains the implementation of the WinRT wrapper for the WSLC SDK SessionSettings class. + +--*/ + #include "precomp.h" #include "SessionSettings.h" #include "Microsoft.WSL.Containers.SessionSettings.g.cpp" diff --git a/src/windows/WslcSDK/winrt/SessionSettings.h b/src/windows/WslcSDK/winrt/SessionSettings.h index c7a36ec3c..00bcb713c 100644 --- a/src/windows/WslcSDK/winrt/SessionSettings.h +++ b/src/windows/WslcSDK/winrt/SessionSettings.h @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + SessionSettings.h + +Abstract: + + This file contains the definition of the WinRT wrapper for the WSLC SDK SessionSettings class. + +--*/ + #pragma once #include "Microsoft.WSL.Containers.SessionSettings.g.h" #include "VhdRequirements.h" diff --git a/src/windows/WslcSDK/winrt/VhdRequirements.cpp b/src/windows/WslcSDK/winrt/VhdRequirements.cpp index 1953d1b99..8a9bb3ada 100644 --- a/src/windows/WslcSDK/winrt/VhdRequirements.cpp +++ b/src/windows/WslcSDK/winrt/VhdRequirements.cpp @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + VhdRequirements.cpp + +Abstract: + + This file contains the implementation of the WinRT wrapper for the WSLC SDK VhdRequirements class. + +--*/ + #include "precomp.h" #include "VhdRequirements.h" #include "Microsoft.WSL.Containers.VhdRequirements.g.cpp" diff --git a/src/windows/WslcSDK/winrt/VhdRequirements.h b/src/windows/WslcSDK/winrt/VhdRequirements.h index 41a0e1373..e26a9745c 100644 --- a/src/windows/WslcSDK/winrt/VhdRequirements.h +++ b/src/windows/WslcSDK/winrt/VhdRequirements.h @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + VhdRequirements.h + +Abstract: + + This file contains the definition of the WinRT wrapper for the WSLC SDK VhdRequirements class. + +--*/ + #pragma once #include "Microsoft.WSL.Containers.VhdRequirements.g.h" #include "Helpers.h" diff --git a/src/windows/WslcSDK/winrt/precomp.h b/src/windows/WslcSDK/winrt/precomp.h index 8d78e9c92..44d0d436c 100644 --- a/src/windows/WslcSDK/winrt/precomp.h +++ b/src/windows/WslcSDK/winrt/precomp.h @@ -1,3 +1,17 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + precomp.h + +Abstract: + + The precompiled header for WslcSDK/winrt. + +--*/ + #pragma once #include "wslcsdk.h" From 9f79a00da16ce9855149da3c2cda6152926ffd72 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Fri, 17 Apr 2026 16:45:05 -0700 Subject: [PATCH 08/13] Fix .slnx platform selection --- CMakeLists.txt | 5 ----- cmake/FindCSharp.cmake | 5 +++++ src/windows/WslcSDK/csharp/CMakeLists.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a81bb771e..7842f9eaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -276,11 +276,6 @@ if (${TARGET_PLATFORM} STREQUAL "x64") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /CETCOMPAT") endif() -set(CMAKE_CSharp_FLAGS "${CMAKE_CSharp_FLAGS} /langversion:latest /debug:full") -set(CMAKE_DOTNET_SDK "Microsoft.NET.Sdk") -set(CMAKE_DOTNET_TARGET_FRAMEWORK "net8.0-windows${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") -set(WSL_NUGET_TARGET_FRAMEWORK "net8.0-windows10.0.19041.0") - # Common link libraries link_directories(${WSLDEPS_SOURCE_DIR}/lib/) set(COMMON_LINK_LIBRARIES diff --git a/cmake/FindCSharp.cmake b/cmake/FindCSharp.cmake index 1c59c0b38..06c73da0f 100644 --- a/cmake/FindCSharp.cmake +++ b/cmake/FindCSharp.cmake @@ -1,4 +1,9 @@ function(configure_csharp_target TARGET) + set(CMAKE_CSharp_FLAGS "${CMAKE_CSharp_FLAGS} /langversion:latest /debug:full" SCOPE PARENT) + set(CMAKE_DOTNET_SDK "Microsoft.NET.Sdk" SCOPE PARENT) + set(CMAKE_DOTNET_TARGET_FRAMEWORK "net8.0-windows${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" SCOPE PARENT) + set(WSL_NUGET_TARGET_FRAMEWORK "net8.0-windows10.0.19041.0" SCOPE PARENT) + set(TARGET_PLATFORM_MIN_VERSION "10.0.19041.0") set_target_properties( diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt index a2661bee9..d42d44012 100644 --- a/src/windows/WslcSDK/csharp/CMakeLists.txt +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -16,7 +16,7 @@ set_target_properties( wslcsdkcs PROPERTIES FOLDER windows LINKER_LANGUAGE CSharp - VS_GLOBAL_PlatformTarget "AnyCPU" + VS_GLOBAL_PlatformTarget "${TARGET_PLATFORM}" VS_PACKAGE_REFERENCES "Microsoft.Windows.CsWinRT_${CSWINRT_VERSION}" VS_GLOBAL_CsWinRTIncludes "Microsoft.WSL.Containers" ) From 67eec8d6e67cf02661119c916bd444a0032b42d6 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Mon, 20 Apr 2026 17:02:39 -0700 Subject: [PATCH 09/13] PR feedback --- cmake/FindCSharp.cmake | 9 +++------ cmake/FindIDL.cmake | 2 +- nuget/CMakeLists.txt | 1 + nuget/Microsoft.WSL.Containers.nuspec.in | 6 +++--- src/windows/WslcSDK/CMakeLists.txt | 1 + src/windows/WslcSDK/Defaults.h | 22 +++++++++++++++++++++ src/windows/WslcSDK/winrt/SessionSettings.h | 7 ++++--- src/windows/WslcSDK/wslcsdk.cpp | 7 +------ 8 files changed, 36 insertions(+), 19 deletions(-) create mode 100644 src/windows/WslcSDK/Defaults.h diff --git a/cmake/FindCSharp.cmake b/cmake/FindCSharp.cmake index 06c73da0f..d6a40733a 100644 --- a/cmake/FindCSharp.cmake +++ b/cmake/FindCSharp.cmake @@ -1,11 +1,6 @@ function(configure_csharp_target TARGET) - set(CMAKE_CSharp_FLAGS "${CMAKE_CSharp_FLAGS} /langversion:latest /debug:full" SCOPE PARENT) - set(CMAKE_DOTNET_SDK "Microsoft.NET.Sdk" SCOPE PARENT) - set(CMAKE_DOTNET_TARGET_FRAMEWORK "net8.0-windows${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" SCOPE PARENT) - set(WSL_NUGET_TARGET_FRAMEWORK "net8.0-windows10.0.19041.0" SCOPE PARENT) - set(TARGET_PLATFORM_MIN_VERSION "10.0.19041.0") - + target_compile_options(${TARGET} PRIVATE "/langversion:latest" "/debug:full") set_target_properties( ${TARGET} PROPERTIES VS_GLOBAL_TargetPlatformVersion "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" @@ -14,5 +9,7 @@ function(configure_csharp_target TARGET) VS_GLOBAL_AppendRuntimeIdentifierToOutputPath false VS_GLOBAL_GenerateAssemblyInfo false VS_GLOBAL_TargetLatestRuntimePatch false + DOTNET_SDK "Microsoft.NET.Sdk" + DOTNET_TARGET_FRAMEWORK "net8.0-windows${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" ) endfunction() \ No newline at end of file diff --git a/cmake/FindIDL.cmake b/cmake/FindIDL.cmake index b3a824731..845841840 100644 --- a/cmake/FindIDL.cmake +++ b/cmake/FindIDL.cmake @@ -85,7 +85,7 @@ endfunction() function(add_idl_winrt target idl_file) set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}) - cmake_path(NATIVE_PATH OUTPUT_DIR OUTPUT_DIR) # midl is picky about path formats + file(TO_NATIVE_PATH ${OUTPUT_DIR} OUTPUT_DIR) # midl is picky about path formats file(MAKE_DIRECTORY ${OUTPUT_DIR}) set(IDL_DEFINITIONS "") diff --git a/nuget/CMakeLists.txt b/nuget/CMakeLists.txt index f0271a832..f4d43426c 100644 --- a/nuget/CMakeLists.txt +++ b/nuget/CMakeLists.txt @@ -1,4 +1,5 @@ set(NUGET_PACKAGES Microsoft.WSL.PluginApi.nuspec Microsoft.WSL.Containers.nuspec) +set(NUGET_TARGET_FRAMEWORK "net8.0-windows10.0.19041.0") # generate vars with native paths since nuget won't accept unix path separators cmake_path(NATIVE_PATH CMAKE_SOURCE_DIR CMAKE_SOURCE_DIR_NATIVE) diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index 0aa21d402..ed0a7168a 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -12,12 +12,12 @@ MIT docs\README.MD - + - + @@ -25,6 +25,6 @@ - + diff --git a/src/windows/WslcSDK/CMakeLists.txt b/src/windows/WslcSDK/CMakeLists.txt index f57649561..c4a0a3cc3 100644 --- a/src/windows/WslcSDK/CMakeLists.txt +++ b/src/windows/WslcSDK/CMakeLists.txt @@ -6,6 +6,7 @@ set(SOURCES WslcsdkPrivate.cpp ) set(HEADERS + Defaults.h IOCallback.h ProgressCallback.h TerminationCallback.h diff --git a/src/windows/WslcSDK/Defaults.h b/src/windows/WslcSDK/Defaults.h new file mode 100644 index 000000000..8e61e597f --- /dev/null +++ b/src/windows/WslcSDK/Defaults.h @@ -0,0 +1,22 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + Defaults.h + +Abstract: + + Contains default values for settings used in the WSL Container SDK. + +--*/ + +#pragma once + +constexpr uint32_t s_DefaultCPUCount = 2; +constexpr uint32_t s_DefaultMemoryMB = 2000; +// Maximum value per use with HVSOCKET_CONNECT_TIMEOUT_MAX +constexpr ULONG s_DefaultBootTimeout = 300000; +// Default to 1 GB +constexpr UINT64 s_DefaultStorageSize = 1000 * 1000 * 1000; diff --git a/src/windows/WslcSDK/winrt/SessionSettings.h b/src/windows/WslcSDK/winrt/SessionSettings.h index 00bcb713c..113acf214 100644 --- a/src/windows/WslcSDK/winrt/SessionSettings.h +++ b/src/windows/WslcSDK/winrt/SessionSettings.h @@ -16,6 +16,7 @@ Module Name: #include "Microsoft.WSL.Containers.SessionSettings.g.h" #include "VhdRequirements.h" #include "Helpers.h" +#include "Defaults.h" namespace winrt::Microsoft::WSL::Containers::implementation { struct SessionSettings : SessionSettingsT @@ -42,9 +43,9 @@ struct SessionSettings : SessionSettingsT WslcSessionSettings m_sessionSettings{}; std::wstring m_name; std::wstring m_storagePath; - uint32_t m_cpuCount{2}; - uint32_t m_memoryMb{2000}; - uint32_t m_timeoutMS{30000}; + uint32_t m_cpuCount{s_DefaultCPUCount}; + uint32_t m_memoryMb{s_DefaultMemoryMB}; + uint32_t m_timeoutMS{s_DefaultBootTimeout}; winrt::Microsoft::WSL::Containers::VhdRequirements m_vhdRequirements{nullptr}; winrt::Microsoft::WSL::Containers::SessionFeatureFlags m_featureFlags{winrt::Microsoft::WSL::Containers::SessionFeatureFlags::None}; }; diff --git a/src/windows/WslcSDK/wslcsdk.cpp b/src/windows/WslcSDK/wslcsdk.cpp index b67b97112..84b736285 100644 --- a/src/windows/WslcSDK/wslcsdk.cpp +++ b/src/windows/WslcSDK/wslcsdk.cpp @@ -15,6 +15,7 @@ Module Name: #include "wslcsdk.h" #include "WslcsdkPrivate.h" +#include "Defaults.h" #include "ProgressCallback.h" #include "TerminationCallback.h" #include "wslutil.h" @@ -23,12 +24,6 @@ using namespace std::string_view_literals; using namespace wsl::windows::common::wslutil; namespace { -constexpr uint32_t s_DefaultCPUCount = 2; -constexpr uint32_t s_DefaultMemoryMB = 2000; -// Maximum value per use with HVSOCKET_CONNECT_TIMEOUT_MAX -constexpr ULONG s_DefaultBootTimeout = 300000; -// Default to 1 GB -constexpr UINT64 s_DefaultStorageSize = 1000 * 1000 * 1000; #define WSLC_FLAG_VALUE_ASSERT(_wlsc_name_, _wslc_name_) \ static_assert(_wlsc_name_ == _wslc_name_, "Flag values differ: " #_wlsc_name_ " != " #_wslc_name_); From 94140f90afa12857d266c7e1214beb94f8f37d50 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Tue, 21 Apr 2026 12:05:40 -0700 Subject: [PATCH 10/13] Separate C# DLLs --- nuget/Microsoft.WSL.Containers.nuspec.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index ed0a7168a..852abfedf 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -17,13 +17,14 @@ - + + From af256d825c463ebbbe2754e34811b25315410a5b Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Wed, 22 Apr 2026 16:16:00 -0700 Subject: [PATCH 11/13] Merge into wslcsdk.dll --- nuget/Microsoft.WSL.Containers.nuspec.in | 13 +++++-------- .../native/Microsoft.WSL.Containers.targets | 6 +++--- .../build/net/Microsoft.WSL.Containers.targets | 3 +-- src/windows/WslcSDK/CMakeLists.txt | 16 ++++++++++------ src/windows/WslcSDK/csharp/CMakeLists.txt | 1 - src/windows/WslcSDK/winrt/CMakeLists.txt | 7 ++----- src/windows/WslcSDK/winrt/wslcsdkwinrt.def | 3 --- src/windows/WslcSDK/wslcsdk.def | 7 ++----- 8 files changed, 23 insertions(+), 33 deletions(-) delete mode 100644 src/windows/WslcSDK/winrt/wslcsdkwinrt.def diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index 852abfedf..cf25216eb 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -17,14 +17,11 @@ - - - - - - - - + + + + + diff --git a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets index abd559faa..395f6255b 100644 --- a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets @@ -14,7 +14,7 @@ - wslcsdk.lib; + Microsoft.WSL.Containers.lib; %(AdditionalDependencies) @@ -25,10 +25,10 @@ - + - + \ No newline at end of file diff --git a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets index f81b2c9ac..295257652 100644 --- a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets @@ -20,13 +20,12 @@ - - + \ No newline at end of file diff --git a/src/windows/WslcSDK/CMakeLists.txt b/src/windows/WslcSDK/CMakeLists.txt index c4a0a3cc3..1acc7133f 100644 --- a/src/windows/WslcSDK/CMakeLists.txt +++ b/src/windows/WslcSDK/CMakeLists.txt @@ -15,11 +15,15 @@ set(HEADERS ) add_library(wslcsdk SHARED ${SOURCES} ${HEADERS} wslcsdk.def) -set_target_properties(wslcsdk PROPERTIES EXCLUDE_FROM_ALL FALSE) -add_dependencies(wslcsdk wslserviceidl) -target_link_libraries(wslcsdk ${COMMON_LINK_LIBRARIES} legacy_stdio_definitions common) -target_precompile_headers(wslcsdk REUSE_FROM common) -set_target_properties(wslcsdk PROPERTIES FOLDER windows) +set_target_properties(wslcsdk + PROPERTIES + EXCLUDE_FROM_ALL FALSE + FOLDER windows +) add_subdirectory(winrt) -add_subdirectory(csharp) \ No newline at end of file +add_subdirectory(csharp) + +add_dependencies(wslcsdk wslserviceidl wslcsdkwinrt) +target_link_libraries(wslcsdk ${COMMON_LINK_LIBRARIES} legacy_stdio_definitions common wslcsdkwinrt) +target_precompile_headers(wslcsdk REUSE_FROM common) \ No newline at end of file diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt index d42d44012..d1060d803 100644 --- a/src/windows/WslcSDK/csharp/CMakeLists.txt +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -16,7 +16,6 @@ set_target_properties( wslcsdkcs PROPERTIES FOLDER windows LINKER_LANGUAGE CSharp - VS_GLOBAL_PlatformTarget "${TARGET_PLATFORM}" VS_PACKAGE_REFERENCES "Microsoft.Windows.CsWinRT_${CSWINRT_VERSION}" VS_GLOBAL_CsWinRTIncludes "Microsoft.WSL.Containers" ) diff --git a/src/windows/WslcSDK/winrt/CMakeLists.txt b/src/windows/WslcSDK/winrt/CMakeLists.txt index d409a7f91..3e14ea22f 100644 --- a/src/windows/WslcSDK/winrt/CMakeLists.txt +++ b/src/windows/WslcSDK/winrt/CMakeLists.txt @@ -14,8 +14,8 @@ set(HEADERS VhdRequirements.h ) -add_library(wslcsdkwinrt SHARED ${SOURCES} ${HEADERS}) -add_dependencies(wslcsdkwinrt wslcsdk wslcsdkwinrtidl) +add_library(wslcsdkwinrt STATIC ${SOURCES} ${HEADERS}) +add_dependencies(wslcsdkwinrt wslcsdkwinrtidl) set(MODULE_G_CPP ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/module.g.cpp) target_sources(wslcsdkwinrt PRIVATE ${MODULE_G_CPP}) @@ -30,9 +30,6 @@ target_include_directories(wslcsdkwinrt PRIVATE ${CMAKE_SOURCE_DIR}/src/windows/WslcSDK ) -target_link_options(wslcsdkwinrt PRIVATE /DEF:${CMAKE_CURRENT_SOURCE_DIR}/wslcsdkwinrt.def) -target_link_libraries(wslcsdkwinrt ${COMMON_LINK_LIBRARIES} wslcsdk) - set_target_properties( wslcsdkwinrt PROPERTIES diff --git a/src/windows/WslcSDK/winrt/wslcsdkwinrt.def b/src/windows/WslcSDK/winrt/wslcsdkwinrt.def deleted file mode 100644 index 4177cdd70..000000000 --- a/src/windows/WslcSDK/winrt/wslcsdkwinrt.def +++ /dev/null @@ -1,3 +0,0 @@ -EXPORTS - DllGetActivationFactory = WINRT_GetActivationFactory PRIVATE - DllCanUnloadNow = WINRT_CanUnloadNow PRIVATE diff --git a/src/windows/WslcSDK/wslcsdk.def b/src/windows/WslcSDK/wslcsdk.def index 800c57d5c..94e8df7ab 100644 --- a/src/windows/WslcSDK/wslcsdk.def +++ b/src/windows/WslcSDK/wslcsdk.def @@ -70,8 +70,5 @@ WslcCanRun WslcGetVersion WslcInstallWithDependencies - - - - - +DllGetActivationFactory = WINRT_GetActivationFactory PRIVATE +DllCanUnloadNow = WINRT_CanUnloadNow PRIVATE From f71105fed5f9812ac97106557beb5521dc528329 Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Thu, 23 Apr 2026 18:00:42 -0700 Subject: [PATCH 12/13] Add custom WinRT activation --- nuget/Microsoft.WSL.Containers.nuspec.in | 12 ++-- .../net/Microsoft.WSL.Containers.targets | 4 +- src/windows/WslcSDK/csharp/CMakeLists.txt | 8 ++- src/windows/WslcSDK/csharp/WinRTActivation.cs | 69 +++++++++++++++++++ src/windows/WslcSDK/winrt/VhdRequirements.cpp | 4 +- 5 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 src/windows/WslcSDK/csharp/WinRTActivation.cs diff --git a/nuget/Microsoft.WSL.Containers.nuspec.in b/nuget/Microsoft.WSL.Containers.nuspec.in index cf25216eb..cadc9c285 100644 --- a/nuget/Microsoft.WSL.Containers.nuspec.in +++ b/nuget/Microsoft.WSL.Containers.nuspec.in @@ -17,11 +17,15 @@ + - - - - + + + + + + + diff --git a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets index 295257652..ecc7f902f 100644 --- a/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/net/Microsoft.WSL.Containers.targets @@ -20,12 +20,12 @@ - + - + \ No newline at end of file diff --git a/src/windows/WslcSDK/csharp/CMakeLists.txt b/src/windows/WslcSDK/csharp/CMakeLists.txt index d1060d803..ed7efcff8 100644 --- a/src/windows/WslcSDK/csharp/CMakeLists.txt +++ b/src/windows/WslcSDK/csharp/CMakeLists.txt @@ -4,7 +4,13 @@ add_library(wslcsdkcs SHARED) configure_csharp_target(wslcsdkcs) set(WSLCSDK_WINMD "${CMAKE_CURRENT_BINARY_DIR}/../winrt/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE}/wslcsdk.winmd") -target_sources(wslcsdkcs PRIVATE "${WSLCSDK_WINMD}") + +target_sources(wslcsdkcs + PRIVATE + "${WSLCSDK_WINMD}" + "${CMAKE_CURRENT_SOURCE_DIR}/WinRTActivation.cs" +) + set_source_files_properties( "${WSLCSDK_WINMD}" PROPERTIES diff --git a/src/windows/WslcSDK/csharp/WinRTActivation.cs b/src/windows/WslcSDK/csharp/WinRTActivation.cs new file mode 100644 index 000000000..663b74ac0 --- /dev/null +++ b/src/windows/WslcSDK/csharp/WinRTActivation.cs @@ -0,0 +1,69 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using WinRT; + +namespace Microsoft.WSL.Containers; + +internal static class WinRTActivation +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate int DllGetActivationFactoryFn(IntPtr classId, out IntPtr factory); + + private static DllGetActivationFactoryFn s_getDllFactory; + + [ModuleInitializer] + internal static void Initialize() + { + s_getDllFactory = Marshal.GetDelegateForFunctionPointer( + NativeLibrary.GetExport( + NativeLibrary.Load("wslcsdk.dll", typeof(WinRTActivation).Assembly, DllImportSearchPath.AssemblyDirectory), + "DllGetActivationFactory")); + + var previousHandler = ActivationFactory.ActivationHandler; + ActivationFactory.ActivationHandler = (typeName, iid) => + typeName.StartsWith("Microsoft.WSL.Containers.", StringComparison.Ordinal) + ? GetActivationFactory(typeName, iid) + : previousHandler?.Invoke(typeName, iid) ?? IntPtr.Zero; + } + + private static IntPtr GetActivationFactory(string typeName, Guid iid) + { + WindowsCreateString(typeName, (uint)typeName.Length, out var hstring); + try + { + if (s_getDllFactory(hstring, out var factory) < 0) + { + return IntPtr.Zero; + } + + if (iid == IID_IActivationFactory) + { + return factory; + } + + try + { + return Marshal.QueryInterface(factory, ref iid, out var queried) >= 0 ? queried : IntPtr.Zero; + } + finally + { + Marshal.Release(factory); + } + } + finally + { + WindowsDeleteString(hstring); + } + } + + private static readonly Guid IID_IActivationFactory = new(0x00000035, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); + + [DllImport("combase.dll", CharSet = CharSet.Unicode)] + private static extern int WindowsCreateString(string sourceString, uint length, out IntPtr hstring); + + [DllImport("combase.dll")] + private static extern int WindowsDeleteString(IntPtr hstring); +} diff --git a/src/windows/WslcSDK/winrt/VhdRequirements.cpp b/src/windows/WslcSDK/winrt/VhdRequirements.cpp index 8a9bb3ada..7084c6ee6 100644 --- a/src/windows/WslcSDK/winrt/VhdRequirements.cpp +++ b/src/windows/WslcSDK/winrt/VhdRequirements.cpp @@ -21,7 +21,7 @@ VhdRequirements::VhdRequirements(hstring const& name, uint64_t sizeInBytes, winr m_name(winrt::to_string(name)) { m_vhdRequirements.name = m_name.c_str(); - m_vhdRequirements.sizeInBytes = sizeInBytes; + m_vhdRequirements.sizeBytes = sizeInBytes; m_vhdRequirements.type = static_cast(type); } @@ -32,7 +32,7 @@ hstring VhdRequirements::Name() uint64_t VhdRequirements::SizeInBytes() { - return m_vhdRequirements.sizeInBytes; + return m_vhdRequirements.sizeBytes; } winrt::Microsoft::WSL::Containers::VhdType VhdRequirements::Type() From 751fe22e38149f3d677c5ec03479830781ce5f8c Mon Sep 17 00:00:00 2001 From: Flor Elisa Chacon Ochoa Date: Fri, 24 Apr 2026 18:10:59 -0700 Subject: [PATCH 13/13] Missed undoing some renames --- .../build/native/Microsoft.WSL.Containers.targets | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets index 395f6255b..abd559faa 100644 --- a/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets +++ b/nuget/Microsoft.WSL.Containers/build/native/Microsoft.WSL.Containers.targets @@ -14,7 +14,7 @@ - Microsoft.WSL.Containers.lib; + wslcsdk.lib; %(AdditionalDependencies) @@ -25,10 +25,10 @@ - + - + \ No newline at end of file