diff --git a/NuGet.config b/NuGet.config
index dc91f8b941028d..bf140690b22d67 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index c16f38751f730a..862e386a6a756c 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -90,13 +90,13 @@
45dd3a73dd5b64b010c4251303b3664bb30df029
-
+
https://github.com/dotnet/emsdk
- 2b0cca8ad3a88e02fe0878139009ffffde071f1f
+ 976b101e5539557c20e2ac39885ac879531bcf82
-
+
https://github.com/dotnet/emsdk
- 2b0cca8ad3a88e02fe0878139009ffffde071f1f
+ 976b101e5539557c20e2ac39885ac879531bcf82
diff --git a/eng/Versions.props b/eng/Versions.props
index b622ef4b514774..454b6acef5fe32 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -1,11 +1,11 @@
- 8.0.17
+ 8.0.18
8
0
- 17
+ 18
8.0.100
7.0.20
6.0.36
@@ -252,7 +252,7 @@
Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml
like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport
-->
- 8.0.17
+ 8.0.18
$(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version)
1.1.87-gba258badda
diff --git a/eng/pipelines/common/macos-sign-with-entitlements.yml b/eng/pipelines/common/macos-sign-with-entitlements.yml
index 2c3c4caf3c723b..94af6e28bab3dd 100644
--- a/eng/pipelines/common/macos-sign-with-entitlements.yml
+++ b/eng/pipelines/common/macos-sign-with-entitlements.yml
@@ -33,12 +33,13 @@ steps:
- task: EsrpCodeSigning@5
displayName: 'ESRP CodeSigning'
inputs:
- ConnectedServiceName: 'DotNet-Engineering-Services_KeyVault'
- AppRegistrationClientId: '28ec6507-2167-4eaa-a294-34408cf5dd0e'
- AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47'
- AuthAKVName: 'EngKeyVault'
- AuthCertName: 'DotNetCore-ESRP-AuthCert'
- AuthSignCertName: 'DotNetCore-ESRP-AuthSignCert'
+ ConnectedServiceName: 'DotNetBuildESRP'
+ UseMSIAuthentication: true
+ EsrpClientId: '28ec6507-2167-4eaa-a294-34408cf5dd0e'
+ AppRegistrationClientId: '0ecbcdb7-8451-4cbe-940a-4ed97b08b955'
+ AppRegistrationTenantId: '975f013f-7f24-47e8-a7d3-abc4752bf346'
+ AuthAKVName: 'DotNetEngKeyVault'
+ AuthSignCertName: 'DotNet-ESRP-AuthSignCert'
FolderPath: '$(Build.ArtifactStagingDirectory)/'
Pattern: 'mac_entitled_to_sign.zip'
UseMinimatch: true
diff --git a/src/installer/tests/HostActivation.Tests/NativeHosting/Comhost.cs b/src/installer/tests/HostActivation.Tests/NativeHosting/Comhost.cs
index 4d023023d9791f..5f10c3672fd102 100644
--- a/src/installer/tests/HostActivation.Tests/NativeHosting/Comhost.cs
+++ b/src/installer/tests/HostActivation.Tests/NativeHosting/Comhost.cs
@@ -116,6 +116,35 @@ public void ActivateClass_IgnoreAppLocalHostFxr()
}
}
+ [Fact]
+ public void ActivateClass_IgnoreWorkingDirectory()
+ {
+ using (TestArtifact cwd = TestArtifact.Create("cwd"))
+ {
+ // Validate that hosting components in the working directory will not be used
+ File.Copy(Binaries.CoreClr.MockPath, Path.Combine(cwd.Location, Binaries.CoreClr.FileName));
+ File.Copy(Binaries.HostFxr.MockPath_5_0, Path.Combine(cwd.Location, Binaries.HostFxr.FileName));
+ File.Copy(Binaries.HostPolicy.MockPath, Path.Combine(cwd.Location, Binaries.HostPolicy.FileName));
+
+ string[] args = {
+ "comhost",
+ "synchronous",
+ "1",
+ sharedState.ComHostPath,
+ sharedState.ClsidString
+ };
+ sharedState.CreateNativeHostCommand(args, sharedState.ComLibraryFixture.BuiltDotnet.BinPath)
+ .WorkingDirectory(cwd.Location)
+ .Execute()
+ .Should().Pass()
+ .And.HaveStdOutContaining("New instance of Server created")
+ .And.HaveStdOutContaining($"Activation of {sharedState.ClsidString} succeeded.")
+ .And.ResolveHostFxr(sharedState.ComLibraryFixture.BuiltDotnet)
+ .And.ResolveHostPolicy(sharedState.ComLibraryFixture.BuiltDotnet)
+ .And.ResolveCoreClr(sharedState.ComLibraryFixture.BuiltDotnet);
+ }
+ }
+
[Fact]
public void ActivateClass_ValidateIErrorInfoResult()
{
diff --git a/src/installer/tests/HostActivation.Tests/NativeHosting/Ijwhost.cs b/src/installer/tests/HostActivation.Tests/NativeHosting/Ijwhost.cs
index 062e6bcc58130f..9fd2dfa0ee57b5 100644
--- a/src/installer/tests/HostActivation.Tests/NativeHosting/Ijwhost.cs
+++ b/src/installer/tests/HostActivation.Tests/NativeHosting/Ijwhost.cs
@@ -73,6 +73,34 @@ public void LoadLibrary_ContextConfig(bool load_isolated)
}
}
+ [Fact]
+ public void LoadLibrary_IgnoreWorkingDirectory()
+ {
+ using (TestArtifact cwd = TestArtifact.Create("cwd"))
+ {
+ // Validate that hosting components in the working directory will not be used
+ File.Copy(Binaries.CoreClr.MockPath, Path.Combine(cwd.Location, Binaries.CoreClr.FileName));
+ File.Copy(Binaries.HostFxr.MockPath_5_0, Path.Combine(cwd.Location, Binaries.HostFxr.FileName));
+ File.Copy(Binaries.HostPolicy.MockPath, Path.Combine(cwd.Location, Binaries.HostPolicy.FileName));
+
+ string [] args = {
+ "ijwhost",
+ sharedState.IjwApp.AppDll,
+ "NativeEntryPoint"
+ };
+ var dotnet = new Microsoft.DotNet.Cli.Build.DotNetCli(sharedState.RepoDirectories.BuiltDotnet);
+ sharedState.CreateNativeHostCommand(args, sharedState.RepoDirectories.BuiltDotnet)
+ .WorkingDirectory(cwd.Location)
+ .Execute()
+ .Should().Pass()
+ .And.HaveStdOutContaining("[C++/CLI] NativeEntryPoint: calling managed class")
+ .And.HaveStdOutContaining("[C++/CLI] ManagedClass: AssemblyLoadContext = \"Default\" System.Runtime.Loader.DefaultAssemblyLoadContext")
+ .And.ResolveHostFxr(dotnet)
+ .And.ResolveHostPolicy(dotnet)
+ .And.ResolveCoreClr(dotnet);
+ }
+ }
+
[Theory]
[InlineData(true)]
[InlineData(false)]
diff --git a/src/installer/tests/HostActivation.Tests/NativeHosting/LoadAssemblyAndGetFunctionPointer.cs b/src/installer/tests/HostActivation.Tests/NativeHosting/LoadAssemblyAndGetFunctionPointer.cs
index 653a44eb289677..6fd5be36a99d75 100644
--- a/src/installer/tests/HostActivation.Tests/NativeHosting/LoadAssemblyAndGetFunctionPointer.cs
+++ b/src/installer/tests/HostActivation.Tests/NativeHosting/LoadAssemblyAndGetFunctionPointer.cs
@@ -234,6 +234,38 @@ public void CallDelegateOnComponentContext_UnhandledException()
.And.ExecuteFunctionPointerWithException(entryPoint, 1);
}
+ [Fact]
+ public void CallDelegateOnComponentContext_IgnoreWorkingDirectory()
+ {
+ using (TestArtifact cwd = TestArtifact.Create("cwd"))
+ {
+ // Validate that hosting components in the working directory will not be used
+ File.Copy(Binaries.CoreClr.MockPath, Path.Combine(cwd.Location, Binaries.CoreClr.FileName));
+ File.Copy(Binaries.HostPolicy.MockPath, Path.Combine(cwd.Location, Binaries.HostPolicy.FileName));
+
+ var component = sharedState.ComponentWithNoDependenciesFixture.TestProject;
+ string[] args =
+ {
+ ComponentLoadAssemblyAndGetFunctionPointerArg,
+ sharedState.HostFxrPath,
+ component.RuntimeConfigJson,
+ component.AppDll,
+ sharedState.ComponentTypeName,
+ sharedState.ComponentEntryPoint1,
+ };
+
+ var dotnet = new Microsoft.DotNet.Cli.Build.DotNetCli(sharedState.DotNetRoot);
+ sharedState.CreateNativeHostCommand(args, sharedState.DotNetRoot)
+ .WorkingDirectory(cwd.Location)
+ .Execute()
+ .Should().Pass()
+ .And.InitializeContextForConfig(component.RuntimeConfigJson)
+ .And.ExecuteFunctionPointer(sharedState.ComponentEntryPoint1, 1, 1)
+ .And.ResolveHostPolicy(dotnet)
+ .And.ResolveCoreClr(dotnet);
+ }
+ }
+
public class SharedTestState : SharedTestStateBase
{
public string HostFxrPath { get; }
diff --git a/src/installer/tests/HostActivation.Tests/NativeHosting/FunctionPointerResultExtensions.cs b/src/installer/tests/HostActivation.Tests/NativeHosting/NativeHostingResultExtensions.cs
similarity index 69%
rename from src/installer/tests/HostActivation.Tests/NativeHosting/FunctionPointerResultExtensions.cs
rename to src/installer/tests/HostActivation.Tests/NativeHosting/NativeHostingResultExtensions.cs
index 09fdc52bc186bf..9a0447a219dcb9 100644
--- a/src/installer/tests/HostActivation.Tests/NativeHosting/FunctionPointerResultExtensions.cs
+++ b/src/installer/tests/HostActivation.Tests/NativeHosting/NativeHostingResultExtensions.cs
@@ -2,10 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.IO;
namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.NativeHosting
{
- internal static class FunctionPointerResultExtensions
+ internal static class NativeHostingResultExtensions
{
public static FluentAssertions.AndConstraint ExecuteFunctionPointer(this CommandResultAssertions assertion, string methodName, int callCount, int returnValue)
{
@@ -47,5 +48,21 @@ public static FluentAssertions.AndConstraint ExecuteWit
{
return assertion.HaveStdOutContaining($"{assemblyName}: Location = '{location}'");
}
+
+ public static FluentAssertions.AndConstraint ResolveHostFxr(this CommandResultAssertions assertion, Microsoft.DotNet.Cli.Build.DotNetCli dotnet)
+ {
+ return assertion.HaveStdErrContaining($"Resolved fxr [{dotnet.GreatestVersionHostFxrFilePath}]");
+ }
+
+ public static FluentAssertions.AndConstraint ResolveHostPolicy(this CommandResultAssertions assertion, Microsoft.DotNet.Cli.Build.DotNetCli dotnet)
+ {
+ return assertion.HaveStdErrContaining($"{Binaries.HostPolicy.FileName} directory is [{dotnet.GreatestVersionSharedFxPath}]");
+ }
+
+ public static FluentAssertions.AndConstraint ResolveCoreClr(this CommandResultAssertions assertion, Microsoft.DotNet.Cli.Build.DotNetCli dotnet)
+ {
+ return assertion.HaveStdErrContaining($"CoreCLR path = '{Path.Combine(dotnet.GreatestVersionSharedFxPath, Binaries.CoreClr.FileName)}'")
+ .And.HaveStdErrContaining($"CoreCLR dir = '{dotnet.GreatestVersionSharedFxPath}{Path.DirectorySeparatorChar}'");
+ }
}
}
diff --git a/src/installer/tests/TestUtils/TestArtifact.cs b/src/installer/tests/TestUtils/TestArtifact.cs
index c900bba17005c5..23fac7eceec575 100644
--- a/src/installer/tests/TestUtils/TestArtifact.cs
+++ b/src/installer/tests/TestUtils/TestArtifact.cs
@@ -52,6 +52,20 @@ protected TestArtifact(TestArtifact source)
source._copies.Add(this);
}
+ ///
+ /// Create a new test artifact.
+ ///
+ /// Name of the test artifact
+ /// Test artifact containing no files
+ public static TestArtifact Create(string name)
+ {
+ var (location, parentPath) = GetNewTestArtifactPath(name);
+ return new TestArtifact(location)
+ {
+ DirectoryToDelete = parentPath
+ };
+ }
+
protected void RegisterCopy(TestArtifact artifact)
{
_copies.Add(artifact);
diff --git a/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj b/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj
index eba2fe5b83252c..1abbdcedebe8d8 100644
--- a/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj
+++ b/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj
@@ -4,7 +4,7 @@
true
true
true
- true
+ false
2
true
true
diff --git a/src/libraries/System.Net.Http.WinHttpHandler/src/System.Net.Http.WinHttpHandler.csproj b/src/libraries/System.Net.Http.WinHttpHandler/src/System.Net.Http.WinHttpHandler.csproj
index 65ec45bc444f7c..1dd7b656fe5c2d 100644
--- a/src/libraries/System.Net.Http.WinHttpHandler/src/System.Net.Http.WinHttpHandler.csproj
+++ b/src/libraries/System.Net.Http.WinHttpHandler/src/System.Net.Http.WinHttpHandler.csproj
@@ -4,7 +4,7 @@
true
true
true
- true
+ false
3
Provides a message handler for HttpClient based on the WinHTTP interface of Windows. While similar to HttpClientHandler, it provides developers more granular control over the application's HTTP communication than the HttpClientHandler.
diff --git a/src/native/corehost/apphost/standalone/hostfxr_resolver.cpp b/src/native/corehost/apphost/standalone/hostfxr_resolver.cpp
index 2c244807ac9a94..d06be0719551f5 100644
--- a/src/native/corehost/apphost/standalone/hostfxr_resolver.cpp
+++ b/src/native/corehost/apphost/standalone/hostfxr_resolver.cpp
@@ -38,6 +38,11 @@ hostfxr_resolver_t::hostfxr_resolver_t(const pal::string_t& app_root)
{
m_status_code = StatusCode::CoreHostLibMissingFailure;
}
+ else if (!pal::is_path_rooted(m_fxr_path))
+ {
+ // We should always be loading hostfxr from an absolute path
+ m_status_code = StatusCode::CoreHostLibMissingFailure;
+ }
else if (pal::load_library(&m_fxr_path, &m_hostfxr_dll))
{
m_status_code = StatusCode::Success;
diff --git a/src/native/corehost/fxr/standalone/hostpolicy_resolver.cpp b/src/native/corehost/fxr/standalone/hostpolicy_resolver.cpp
index 67ddd18de3a488..bb0da3238f42b6 100644
--- a/src/native/corehost/fxr/standalone/hostpolicy_resolver.cpp
+++ b/src/native/corehost/fxr/standalone/hostpolicy_resolver.cpp
@@ -180,6 +180,10 @@ int hostpolicy_resolver::load(
return StatusCode::CoreHostLibMissingFailure;
}
+ // We should always be loading hostpolicy from an absolute path
+ if (!pal::is_path_rooted(host_path))
+ return StatusCode::CoreHostLibMissingFailure;
+
// Load library
// We expect to leak hostpolicy - just as we do not unload coreclr, we do not unload hostpolicy
if (!pal::load_library(&host_path, &g_hostpolicy))
diff --git a/src/native/corehost/fxr_resolver.h b/src/native/corehost/fxr_resolver.h
index 3df6c2de3053d3..ecbf37c12b1ffc 100644
--- a/src/native/corehost/fxr_resolver.h
+++ b/src/native/corehost/fxr_resolver.h
@@ -44,6 +44,10 @@ int load_fxr_and_get_delegate(hostfxr_delegate_type type, THostPathToConfigCallb
return StatusCode::CoreHostLibMissingFailure;
}
+ // We should always be loading hostfxr from an absolute path
+ if (!pal::is_path_rooted(fxr_path))
+ return StatusCode::CoreHostLibMissingFailure;
+
// Load library
if (!pal::load_library(&fxr_path, &fxr))
{
diff --git a/src/native/corehost/hostpolicy/deps_resolver.cpp b/src/native/corehost/hostpolicy/deps_resolver.cpp
index 66d44f0c17dae0..a00f4dabc71545 100644
--- a/src/native/corehost/hostpolicy/deps_resolver.cpp
+++ b/src/native/corehost/hostpolicy/deps_resolver.cpp
@@ -830,13 +830,21 @@ bool deps_resolver_t::resolve_probe_dirs(
}
}
- // If the deps file is missing add known locations.
- if (!get_app_deps().exists())
+ // If the deps file is missing for the app, add known locations.
+ // For libhost scenarios, there is no app or app path
+ if (m_host_mode != host_mode_t::libhost && !get_app_deps().exists())
{
+ assert(!m_app_dir.empty());
+
// App local path
add_unique_path(asset_type, m_app_dir, &items, output, &non_serviced, core_servicing);
- (void) library_exists_in_dir(m_app_dir, LIBCORECLR_NAME, &m_coreclr_path);
+ if (m_coreclr_path.empty())
+ {
+ // deps_resolver treats being able to get the coreclr path as optional, so we ignore the return value here.
+ // The caller is responsible for checking whether coreclr path is set and handling as appropriate.
+ (void) library_exists_in_dir(m_app_dir, LIBCORECLR_NAME, &m_coreclr_path);
+ }
}
// Handle any additional deps.json that were specified.
diff --git a/src/native/corehost/hostpolicy/standalone/coreclr_resolver.cpp b/src/native/corehost/hostpolicy/standalone/coreclr_resolver.cpp
index b040c3e8546278..8df8e395e3f259 100644
--- a/src/native/corehost/hostpolicy/standalone/coreclr_resolver.cpp
+++ b/src/native/corehost/hostpolicy/standalone/coreclr_resolver.cpp
@@ -13,6 +13,10 @@ bool coreclr_resolver_t::resolve_coreclr(const pal::string_t& libcoreclr_path, c
pal::string_t coreclr_dll_path(libcoreclr_path);
append_path(&coreclr_dll_path, LIBCORECLR_NAME);
+ // We should always be loading coreclr from an absolute path
+ if (!pal::is_path_rooted(coreclr_dll_path))
+ return false;
+
if (!pal::load_library(&coreclr_dll_path, &coreclr_resolver_contract.coreclr))
{
return false;