From 321ea294068971a9959dd4a0a75551e9b9e109af Mon Sep 17 00:00:00 2001 From: Rainer Sigwald Date: Tue, 22 Oct 2019 15:11:20 -0500 Subject: [PATCH] More-tolerant mscorlib type references (#4829) Fixes #4773 by treating string and MemoryStream types as a prefix match on the mscorlib identity, hoping to more closely match `Type.GetType`'s behavior. --- .../MSBuildResXReader_Tests.cs | 33 +++++++++++++++++++ .../ResourceHandling/MSBuildResXReader.cs | 9 +++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/Tasks.UnitTests/ResourceHandling/MSBuildResXReader_Tests.cs b/src/Tasks.UnitTests/ResourceHandling/MSBuildResXReader_Tests.cs index 7882991d579..6e816f18cfb 100644 --- a/src/Tasks.UnitTests/ResourceHandling/MSBuildResXReader_Tests.cs +++ b/src/Tasks.UnitTests/ResourceHandling/MSBuildResXReader_Tests.cs @@ -243,6 +243,39 @@ public void ResXFileRefToBitmap() resource.TypeAssemblyQualifiedName.ShouldBe("System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); } + [Theory] + [InlineData("System.IO.MemoryStream, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] + [InlineData("System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] + public void ResXFileRefToMemoryStream(string typeNameInResx) + { + using var env = TestEnvironment.Create(_output); + + var baseDir = env.CreateFolder(createFolder: true); + var resourceHandlingFolder = baseDir.CreateDirectory("ResourceHandling"); + + var linkedTextFile = resourceHandlingFolder.CreateFile("FileToBeIncluded.txt"); + + File.WriteAllText(linkedTextFile.Path, + "Test data"); + + var resources = MSBuildResXReader.GetResourcesFromString( + ResXHelper.SurroundWithBoilerplate( +$@" + {linkedTextFile.Path};{typeNameInResx} + +")); + + var resource = resources.ShouldHaveSingleItem() + .ShouldBeOfType(); + resource.Name.ShouldBe("Image1"); + + byte[] bytes = new byte[4]; + resource.Value + .ShouldBeOfType() + .Read(bytes, 0, 4); + bytes.ShouldBe(new byte[] { 84, 101, 115, 116 }, "Expected the bytes of 'Test' to start the stream"); + } + [Fact] public void AssemblyElementWithNoAliasInfersSimpleName() { diff --git a/src/Tasks/ResourceHandling/MSBuildResXReader.cs b/src/Tasks/ResourceHandling/MSBuildResXReader.cs index cb5c9343545..d2d62c26564 100644 --- a/src/Tasks/ResourceHandling/MSBuildResXReader.cs +++ b/src/Tasks/ResourceHandling/MSBuildResXReader.cs @@ -81,9 +81,9 @@ private static void ParseAssemblyAlias(Dictionary aliases, XEleme private const string ByteArraySerializedObjectMimeType = "application/x-microsoft.net.object.bytearray.base64"; private const string ResMimeType = "text/microsoft-resx"; - private const string StringTypeName20 = "System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; + private const string StringTypeNamePrefix = "System.String, mscorlib,"; private const string StringTypeName40 = "System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; - private const string MemoryStreamTypeNameDesktopFramework = "System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; + private const string MemoryStreamTypeNamePrefix = "System.IO.MemoryStream, mscorlib,"; private static string GetFullTypeNameFromAlias(string aliasedTypeName, Dictionary aliases) { @@ -275,13 +275,12 @@ private static bool IsByteArray(string fileRefType) internal static bool IsString(string fileRefType) { - return fileRefType.Equals(StringTypeName40, StringComparison.Ordinal) || - fileRefType.Equals(StringTypeName20, StringComparison.Ordinal); + return fileRefType.StartsWith(StringTypeNamePrefix, StringComparison.Ordinal); } internal static bool IsMemoryStream(string fileRefType) { - return fileRefType.Equals(MemoryStreamTypeNameDesktopFramework, StringComparison.Ordinal); + return fileRefType.StartsWith(MemoryStreamTypeNamePrefix, StringComparison.Ordinal); } ///