Skip to content

Commit

Permalink
[wasm] Fix crash in PInvokeTableGenerator
Browse files Browse the repository at this point in the history
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.<DistinctIterator>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 dotnet#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     |
  • Loading branch information
radical committed Oct 2, 2021
1 parent 0bf8e5d commit 8b3861e
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions src/tasks/WasmAppBuilder/WasmAppBuilder.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,24 @@
<Compile Include="..\Common\Utils.cs" />
<Compile Include="..\Common\LogAsErrorException.cs" />

<PackageReference Include="Microsoft.Build" Version="$(RefOnlyMicrosoftBuildVersion)" />
<PackageReference Include="Microsoft.Build.Framework" Version="$(RefOnlyMicrosoftBuildFrameworkVersion)" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="$(RefOnlyMicrosoftBuildTasksCoreVersion)" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(RefOnlyMicrosoftBuildUtilitiesCoreVersion)" />
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="4.7.1" />
<!-- Don't include the msbuild assemblies with the task -->
<PackageReference Include="Microsoft.Build" Version="$(RefOnlyMicrosoftBuildVersion)" IncludeAssets="compile" />
<PackageReference Include="Microsoft.Build.Framework" Version="$(RefOnlyMicrosoftBuildFrameworkVersion)" IncludeAssets="compile" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="$(RefOnlyMicrosoftBuildTasksCoreVersion)" IncludeAssets="compile" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(RefOnlyMicrosoftBuildUtilitiesCoreVersion)" IncludeAssets="compile" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkForNETCoreTasks)'">
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="$(SystemReflectionMetadataVersion)" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == '$(TargetFrameworkForNETFrameworkTasks)'">
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="$(SystemReflectionMetadataVersion)" PrivateAssets="all" />

<!-- match was MonoTargets tasks have -->
<!-- These versions should not be newer than what Visual Studio MSBuild uses -->
<PackageReference Include="System.Threading.Tasks.Extensions" Version="$(SystemThreadingTasksExtensionsVersion)" PrivateAssets="all" />
<PackageReference Include="System.Text.Json" Version="5.0.0" PrivateAssets="all" />
</ItemGroup>

<Target Name="GetFilesToPackage" Returns="@(FilesToPackage)">
Expand Down

0 comments on commit 8b3861e

Please sign in to comment.