Skip to content

Commit 641393e

Browse files
[release/7.0] [wasm] ManagedToNativeGenerator: Skip unmanaged dlls (#83957)
1 parent 88b65f9 commit 641393e

File tree

6 files changed

+69
-16
lines changed

6 files changed

+69
-16
lines changed

NuGet.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<clear />
1010
<!--Begin: Package sources managed by Dependency Flow automation. Do not edit the sources below.-->
1111
<!-- Begin: Package sources from dotnet-emsdk -->
12-
<add key="darc-pub-dotnet-emsdk-2a1a284" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-2a1a284c/nuget/v3/index.json" />
12+
<add key="darc-pub-dotnet-emsdk-7fa7119" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-7fa7119c/nuget/v3/index.json" />
1313
<!-- End: Package sources from dotnet-emsdk -->
1414
<!--End: Package sources managed by Dependency Flow automation. Do not edit the sources above.-->
1515
<!--

eng/Version.Details.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@
4848
<Uri>https://github.com/dotnet/command-line-api</Uri>
4949
<Sha>5618b2d243ccdeb5c7e50a298b33b13036b4351b</Sha>
5050
</Dependency>
51-
<Dependency Name="Microsoft.NET.Workload.Emscripten.net6.Manifest-7.0.100" Version="7.0.4">
51+
<Dependency Name="Microsoft.NET.Workload.Emscripten.net6.Manifest-7.0.100" Version="7.0.5">
5252
<Uri>https://github.com/dotnet/emsdk</Uri>
53-
<Sha>2a1a284cb9e62959ed261bba6cfc678612fc4559</Sha>
53+
<Sha>7fa7119c1cdf1290aabb2391c3eee6ed42f8851d</Sha>
5454
</Dependency>
55-
<Dependency Name="Microsoft.NET.Workload.Emscripten.net7.Manifest-7.0.100" Version="7.0.4">
55+
<Dependency Name="Microsoft.NET.Workload.Emscripten.net7.Manifest-7.0.100" Version="7.0.5">
5656
<Uri>https://github.com/dotnet/emsdk</Uri>
57-
<Sha>2a1a284cb9e62959ed261bba6cfc678612fc4559</Sha>
57+
<Sha>7fa7119c1cdf1290aabb2391c3eee6ed42f8851d</Sha>
5858
</Dependency>
5959
</ProductDependencies>
6060
<ToolsetDependencies>

eng/Versions.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
<UsingToolIbcOptimization>false</UsingToolIbcOptimization>
2323
<UsingToolXliff>false</UsingToolXliff>
2424
<LastReleasedStableAssemblyVersion>$(AssemblyVersion)</LastReleasedStableAssemblyVersion>
25-
<MicrosoftNETWorkloadEmscriptennet6Manifest70100Version>7.0.4</MicrosoftNETWorkloadEmscriptennet6Manifest70100Version>
26-
<MicrosoftNETWorkloadEmscriptennet7Manifest70100Version>7.0.4</MicrosoftNETWorkloadEmscriptennet7Manifest70100Version>
25+
<MicrosoftNETWorkloadEmscriptennet6Manifest70100Version>7.0.5</MicrosoftNETWorkloadEmscriptennet6Manifest70100Version>
26+
<MicrosoftNETWorkloadEmscriptennet7Manifest70100Version>7.0.5</MicrosoftNETWorkloadEmscriptennet7Manifest70100Version>
2727
</PropertyGroup>
2828
<ItemGroup>
2929
<!-- The bands we want to produce workload manifests for -->

src/tasks/WasmAppBuilder/IcallTableGenerator.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public IcallTableGenerator(Func<string, string> fixupSymbolName, TaskLoggingHelp
3434
// The runtime icall table should be generated using
3535
// mono --print-icall-table
3636
//
37-
public IEnumerable<string> Generate(string? runtimeIcallTableFile, string[] assemblies, string? outputPath)
37+
public IEnumerable<string> Generate(string? runtimeIcallTableFile, IEnumerable<string> assemblies, string? outputPath)
3838
{
3939
_icalls.Clear();
4040
_signatures.Clear();
@@ -44,9 +44,13 @@ public IEnumerable<string> Generate(string? runtimeIcallTableFile, string[] asse
4444

4545
var resolver = new PathAssemblyResolver(assemblies);
4646
using var mlc = new MetadataLoadContext(resolver, "System.Private.CoreLib");
47-
foreach (var aname in assemblies)
47+
foreach (var asmPath in assemblies)
4848
{
49-
var a = mlc.LoadFromAssemblyPath(aname);
49+
if (!File.Exists(asmPath))
50+
throw new LogAsErrorException($"Cannot find assembly {asmPath}");
51+
52+
Log.LogMessage(MessageImportance.Low, $"Loading {asmPath} to scan for icalls");
53+
var a = mlc.LoadFromAssemblyPath(asmPath);
5054
foreach (var type in a.GetTypes())
5155
ProcessType(type);
5256
}

src/tasks/WasmAppBuilder/ManagedToNativeGenerator.cs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
56
using System.Diagnostics.CodeAnalysis;
7+
using System.IO;
68
using System.Linq;
9+
using System.Reflection.PortableExecutable;
710
using System.Text;
811
using Microsoft.Build.Framework;
912
using Microsoft.Build.Utilities;
1013

1114
public class ManagedToNativeGenerator : Task
1215
{
1316
[Required]
14-
public string[]? Assemblies { get; set; }
17+
public string[] Assemblies { get; set; } = Array.Empty<string>();
1518

1619
public string? RuntimeIcallTableFile { get; set; }
1720

@@ -62,12 +65,14 @@ public override bool Execute()
6265

6366
private void ExecuteInternal()
6467
{
68+
List<string> managedAssemblies = FilterOutUnmanagedBinaries(Assemblies);
69+
6570
var pinvoke = new PInvokeTableGenerator(FixupSymbolName, Log);
6671
var icall = new IcallTableGenerator(FixupSymbolName, Log);
6772

6873
IEnumerable<string> cookies = Enumerable.Concat(
69-
pinvoke.Generate(PInvokeModules, Assemblies!, PInvokeOutputPath!),
70-
icall.Generate(RuntimeIcallTableFile, Assemblies!, IcallOutputPath)
74+
pinvoke.Generate(PInvokeModules, managedAssemblies, PInvokeOutputPath!),
75+
icall.Generate(RuntimeIcallTableFile, managedAssemblies, IcallOutputPath)
7176
);
7277

7378
var m2n = new InterpToNativeGenerator(Log);
@@ -110,4 +115,43 @@ public string FixupSymbolName(string name)
110115
_symbolNameFixups[name] = fixedName;
111116
return fixedName;
112117
}
118+
119+
private List<string> FilterOutUnmanagedBinaries(string[] assemblies)
120+
{
121+
List<string> managedAssemblies = new(assemblies.Length);
122+
foreach (string asmPath in Assemblies)
123+
{
124+
if (!File.Exists(asmPath))
125+
throw new LogAsErrorException($"Cannot find assembly {asmPath}");
126+
127+
try
128+
{
129+
if (!IsManagedAssembly(asmPath))
130+
{
131+
Log.LogMessage(MessageImportance.Low, $"Skipping unmanaged {asmPath}.");
132+
continue;
133+
}
134+
}
135+
catch (Exception ex)
136+
{
137+
Log.LogMessage(MessageImportance.Low, $"Failed to read assembly {asmPath}: {ex}");
138+
throw new LogAsErrorException($"Failed to read assembly {asmPath}: {ex.Message}");
139+
}
140+
141+
managedAssemblies.Add(asmPath);
142+
}
143+
144+
return managedAssemblies;
145+
}
146+
147+
private static bool IsManagedAssembly(string filePath)
148+
{
149+
if (!File.Exists(filePath))
150+
return false;
151+
152+
using FileStream fileStream = File.OpenRead(filePath);
153+
using PEReader reader = new(fileStream, PEStreamOptions.Default);
154+
return reader.HasMetadata;
155+
}
156+
113157
}

src/tasks/WasmAppBuilder/PInvokeTableGenerator.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public PInvokeTableGenerator(Func<string, string> fixupSymbolName, TaskLoggingHe
2424
_fixupSymbolName = fixupSymbolName;
2525
}
2626

27-
public IEnumerable<string> Generate(string[] pinvokeModules, string[] assemblies, string outputPath)
27+
public IEnumerable<string> Generate(string[] pinvokeModules, IEnumerable<string> assemblies, string outputPath)
2828
{
2929
var modules = new Dictionary<string, string>();
3030
foreach (var module in pinvokeModules)
@@ -37,9 +37,14 @@ public IEnumerable<string> Generate(string[] pinvokeModules, string[] assemblies
3737

3838
var resolver = new PathAssemblyResolver(assemblies);
3939
using var mlc = new MetadataLoadContext(resolver, "System.Private.CoreLib");
40-
foreach (var aname in assemblies)
40+
41+
foreach (var asmPath in assemblies)
4142
{
42-
var a = mlc.LoadFromAssemblyPath(aname);
43+
if (!File.Exists(asmPath))
44+
throw new LogAsErrorException($"Cannot find assembly {asmPath}");
45+
46+
Log.LogMessage(MessageImportance.Low, $"Loading {asmPath} to scan for pinvokes");
47+
var a = mlc.LoadFromAssemblyPath(asmPath);
4348
foreach (var type in a.GetTypes())
4449
CollectPInvokes(pinvokes, callbacks, signatures, type);
4550
}

0 commit comments

Comments
 (0)