From 8b3861ea38cfea20b07dad2e451f66d188212f4a Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Thu, 30 Sep 2021 21:53:30 -0400 Subject: [PATCH] [wasm] Fix crash in PInvokeTableGenerator On VS2022 Preview 5, building a blazorwasm project which used sqlite native library crashed: ``` System.BadImageFormatException: Expected signature header for 'Property' or 'Method', but found '9' (0x09). at System.Reflection.Metadata.Ecma335.SignatureDecoder`2.CheckMethodOrPropertyHeader(SignatureHeader header) at System.Reflection.Metadata.Ecma335.SignatureDecoder`2.DecodeMethodSignature(BlobReader& blobReader) at System.Reflection.Metadata.Ecma335.SignatureDecoder`2.DecodeType(BlobReader& blobReader, Boolean allowlypeSpecifications, Int32 typeCode) at System.Reflection.Metadata.Ecma335.SignatureDecoder`2.DecodeMethodSignature(BlobReader& blobReader) at System.Reflection.Metadata.MethodDefinition.DecodeSignature[TType, TGenericContext] (ISignatureTypeProvider`2 provider, TGenericContext genericCo at System.Reflection.TypeLoading.Ecma.EcmaMethodDecoder.SpecializeMethodSigStrings(TypeContext& typeContext) at System.Reflection.TypeLoading.RoDefinitionMethod`1.ComputeMethodSigStrings() at System.Reflection.TypeLoading.RoMethod.ToString() at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.Format(String format, Object arg0, Object arg1, Object arg2) at PInvokeComparer.GetHashCode(PInvoke pinvoke) at ... at System.Ling.Enumerable.d__64`1.MoveNext() at System.Ling.Buffer`1..ctor(IEnumerable`1 source) at System.Ling.Enumerable.ToArray [TSource] (IEnumerable`1 source) at PInvokeTableGenerator.EmitPInvokeTable(StreamWriter w, Dictionary`2 modules, List`1 pinvokes) at PInvokeTableGenerator.GenPInvokeTable(String[] pinvokeModules, String[] assemblies) at PInvokeTableGenerator.Execute() ``` - This is crashing in a new code path(`PInvokeComparer.GetHashCode`) that invokes `methodInfo.ToString()` for methods with `DllImport` attribute. - It fails for `EnumCalendarInfo`, which has a function pointer parameter, which `System.Reflection.MetadataLoadContext`(SRMLC) does not support, and is explicitly worked around in the code. - It usually fails with on `methodInfo.GetParameters()` with `NotSupportedException`, and `methodInfo.ToString()` works fine The difference seems to be because the version of `SRMLC` being bundled with the task is `1.4.5.0`, which is too old. The fix is to use the same version of SRMLC, and `System.Reflection.Metadata`(SRM) used by other tasks, which is `5.0.0` currently. Also, this mirrors some other reference changes from https://github.com/dotnet/runtime/pull/59720 - don't include msbuild assemblies with the task - and explicitly reference `System.Text.Json`, and `System.Threading.Tasks.Extensions` to be sure about the version that we'll include for net472 The following in a table of the assemblies that are bundled with the task, for `net472`, and `net6.0`. The `new` has fewer assemblies. | Path | Old | New | |---------------------------------------------------------------|-------------|-------------| | net472/Microsoft.Bcl.AsyncInterfaces.dll | 1.0.0.0 | 5.0.0.0 | | net472/Microsoft.Build.Framework.dll | 15.1.0.0 | | | net472/Microsoft.Build.Tasks.Core.dll | 15.1.0.0 | | | net472/Microsoft.Build.Utilities.Core.dll | 15.1.0.0 | | | net472/Microsoft.Build.dll | 15.1.0.0 | | | net472/Microsoft.NET.StringTools.dll | 1.0.0.0 | | | net472/Microsoft.VisualStudio.Setup.Configuration.Interop.dll | 1.0.0.0 | | | net472/System.Buffers.dll | 4.0.3.0 | 4.0.3.0 | | net472/System.Collections.Immutable.dll | 5.0.0.0 | 5.0.0.0 | | net472/System.Configuration.ConfigurationManager.dll | 4.0.3.0 | | | net472/System.Memory.dll | 4.0.1.1 | 4.0.1.1 | | net472/System.Numerics.Vectors.dll | 4.1.4.0 | 4.1.4.0 | | net472/System.Reflection.Metadata.dll | 1.4.5.0 | 5.0.0.0 | | net472/System.Reflection.MetadataLoadContext.dll | 4.0.1.1 | 5.0.0.0 | | net472/System.Resources.Extensions.dll | 4.0.0.0 | | | net472/System.Runtime.CompilerServices.Unsafe.dll | 5.0.0.0 | 5.0.0.0 | | net472/System.Security.AccessControl.dll | 4.1.3.0 | | | net472/System.Security.Permissions.dll | 4.0.3.0 | | | net472/System.Security.Principal.Windows.dll | 4.1.3.0 | | | net472/System.Text.Encodings.Web.dll | 4.0.5.0 | 5.0.0.0 | | net472/System.Text.Json.dll | 4.0.1.0 | 5.0.0.0 | | net472/System.Threading.Tasks.Dataflow.dll | 4.6.3.0 | | | net472/System.Threading.Tasks.Extensions.dll | 4.2.0.0 | 4.2.0.1 | | net472/System.ValueTuple.dll | 4.0.3.0 | 4.0.3.0 | | net472/WasmAppBuilder.dll | 6.0.0.0 | 6.0.0.0 | | | | | | net6.0/System.Reflection.MetadataLoadContext.dll | 4.0.1.1 | 5.0.0.0 | | net6.0/WasmAppBuilder.dll | 6.0.0.0 | 6.0.0.0 | --- .../WasmAppBuilder/WasmAppBuilder.csproj | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/tasks/WasmAppBuilder/WasmAppBuilder.csproj b/src/tasks/WasmAppBuilder/WasmAppBuilder.csproj index e51e138961ef0..22a530b7de3d9 100644 --- a/src/tasks/WasmAppBuilder/WasmAppBuilder.csproj +++ b/src/tasks/WasmAppBuilder/WasmAppBuilder.csproj @@ -18,11 +18,24 @@ - - - - - + + + + + + + + + + + + + + + + + +