diff --git a/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs b/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs
index e4791a6bb14e99..1873e38956038e 100644
--- a/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs
+++ b/src/installer/managed/Microsoft.NET.HostModel/ResourceUpdater.cs
@@ -13,7 +13,7 @@ namespace Microsoft.NET.HostModel
///
/// Provides methods for modifying the embedded native resources in a PE image.
///
- public class ResourceUpdater : IDisposable
+ public sealed class ResourceUpdater : IDisposable
{
private readonly FileStream stream;
private readonly PEReader _reader;
@@ -331,12 +331,15 @@ public void Dispose()
GC.SuppressFinalize(this);
}
- public void Dispose(bool disposing)
+ private void Dispose(bool disposing)
{
- if (disposing && !leaveOpen)
+ if (disposing)
{
_reader.Dispose();
- stream.Dispose();
+ if (!leaveOpen)
+ {
+ stream.Dispose();
+ }
}
}
}
diff --git a/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs b/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs
index 30e3efdf1027db..2f25839507bbfa 100644
--- a/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs
+++ b/src/installer/tests/Microsoft.NET.HostModel.Tests/ResourceUpdaterTests.cs
@@ -23,7 +23,7 @@ class TempFile : IDisposable
public TempFile()
{
_path = Path.GetTempFileName();
- Stream = new FileStream(_path, FileMode.Open);
+ Stream = new FileStream(_path, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
public void Dispose()
@@ -169,6 +169,25 @@ void AddResource_AddTwoSameUShortTypeWithDifferName()
}
}
+ [Fact]
+ void DisposeWithLeaveOpenDisposesPEReader()
+ {
+ using var tempFile = GetCurrentAssemblyMemoryStream();
+ PEReader? peReader = null;
+
+ using (var updater = new ResourceUpdater(tempFile.Stream, leaveOpen: true))
+ {
+ FieldInfo? readerField = typeof(ResourceUpdater).GetField("_reader", BindingFlags.Instance | BindingFlags.NonPublic);
+ Assert.NotNull(readerField);
+ peReader = Assert.IsType(readerField.GetValue(updater));
+ _ = peReader.PEHeaders;
+ }
+
+ Assert.NotNull(peReader);
+
+ Assert.Throws(() => _ = peReader!.PEHeaders);
+ }
+
[Fact]
void AddResourcesFromPEImage()
{