Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/design/tools/illink/trimmed-assemblies.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ could be used instead of
<Target Name="ConfigureTrimming"
BeforeTargets="PrepareForILLink">
<ItemGroup>
<TrimmerRootAssembly Include="@(IntermediateAssembly)" />
<TrimmerRootAssembly Include="$(AssemblyName)" />
<ManagedAssemblyToLink>
<IsTrimmable>true</IsTrimmable>
</ManagedAssemblyToLink>
Expand Down
4 changes: 2 additions & 2 deletions eng/illink.targets
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@
</_DependencyDirectoriesNoSlash>
<_DependencyDirectories Remove="@(_DependencyDirectories)" />
<_DependencyDirectories Include="%(_DependencyDirectoriesNoSlash.PathWithoutSlash)" />
<ILLinkTrimInputAssembly Include="$(ILLinkTrimInputPath)$(TargetName)$(TargetExt)">
<ILLinkTrimInputAssembly Include="$(TargetName)">
<RootMode>library</RootMode>
</ILLinkTrimInputAssembly>
</ItemGroup>
Expand All @@ -264,7 +264,7 @@
<ILLinkArgs Condition="@(_DependencyDirectories->Count()) > 0">$(ILLinkArgs) -d @(_DependencyDirectories->'"%(Identity)"', ' -d ')</ILLinkArgs>
</PropertyGroup>

<ILLink AssemblyPaths=""
<ILLink AssemblyPaths="$(ILLinkTrimInputPath)$(TargetName)$(TargetExt)"
RootAssemblyNames="@(ILLinkTrimInputAssembly)"
OutputDirectory="$(ILLinkTrimOutputPath)"
ExtraArgs="$(ILLinkArgs)"
Expand Down
2 changes: 1 addition & 1 deletion eng/testing/tests.mobile.targets
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
console apps, but also for test projects without an entry point. -->
<Target Name="RootEntireIntermediateAssembly" AfterTargets="PrepareForILLink" Condition="'$(OutputType)' != 'Exe'">
<ItemGroup>
<TrimmerRootAssembly Condition="'%(Identity)' == '@(IntermediateAssembly)'">
<TrimmerRootAssembly Condition="'%(Identity)' == '$(AssemblyName)'">
<RootMode>all</RootMode>
</TrimmerRootAssembly>
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,27 +200,14 @@ The .NET Foundation licenses this file to you under the MIT license.
DependsOnTargets="$(IlcCompileDependsOn)">

<ItemGroup>
<!-- Grab the raw ItemGroup that ILLinker accepts in two form: as file names, and as assembly names -->
<_IlcRootedAssembliesRaw Include="@(TrimmerRootAssembly)" Condition="%(TrimmerRootAssembly.RootMode) != 'EntryPoint'" />
<_IlcRootedAssembliesRaw Include="@(ManagedAssemblyToLink)" Condition="%(ManagedAssemblyToLink.TrimMode) == 'copy'" />
<_IlcConditionallyRootedAssembliesRaw Include="@(ManagedAssemblyToLink)" Condition="%(ManagedAssemblyToLink.TrimMode) == 'copyused'" />
<_IlcTrimmedAssembliesRaw Include="@(ManagedAssemblyToLink)" Condition="%(ManagedAssemblyToLink.TrimMode) == 'link'" />
<_IlcSingleWarnAssembliesRaw Include="@(ManagedAssemblyToLink)" Condition="%(ManagedAssemblyToLink.TrimmerSingleWarn) == 'true'" />
<_IlcNoSingleWarnAssembliesRaw Include="@(ManagedAssemblyToLink)" Condition="%(ManagedAssemblyToLink.TrimmerSingleWarn) == 'false'" />

<!-- Now process the raw ItemGroup into the form that ILC accepts: assembly names only -->
<!-- Use the logic that ILLinker uses: if the file exists, this is a file name. Otherwise it's an assembly name -->
<!-- Use System.IO.File.Exists() to avoid directories-->
<_IlcRootedAssemblies Include="@(_IlcRootedAssembliesRaw->'%(Filename)')" Condition="$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcRootedAssemblies Include="@(_IlcRootedAssembliesRaw)" Condition="!$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcConditionallyRootedAssemblies Include="@(_IlcConditionallyRootedAssembliesRaw->'%(Filename)')" Condition="$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcConditionallyRootedAssemblies Include="@(_IlcConditionallyRootedAssembliesRaw)" Condition="!$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcTrimmedAssemblies Include="@(_IlcTrimmedAssembliesRaw->'%(Filename)')" Condition="$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcTrimmedAssemblies Include="@(_IlcTrimmedAssembliesRaw)" Condition="!$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcSingleWarnAssemblies Include="@(_IlcSingleWarnAssembliesRaw->'%(Filename)')" Condition="$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcSingleWarnAssemblies Include="@(_IlcSingleWarnAssembliesRaw)" Condition="!$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcNoSingleWarnAssemblies Include="@(_IlcNoSingleWarnAssembliesRaw->'%(Filename)')" Condition="$([System.IO.File]::Exists('%(Identity)'))" />
<_IlcNoSingleWarnAssemblies Include="@(_IlcNoSingleWarnAssembliesRaw)" Condition="!$([System.IO.File]::Exists('%(Identity)'))" />
<!-- TrimmerRootAssembly contains assembly names only (no paths), so no %(Filename) transform is needed. -->
<!-- ManagedAssemblyToLink contains file paths, so %(Filename) is used to extract the assembly name. -->
<_IlcRootedAssemblies Include="@(TrimmerRootAssembly)" Condition="%(TrimmerRootAssembly.RootMode) != 'EntryPoint'" />
<_IlcRootedAssemblies Include="@(ManagedAssemblyToLink->'%(Filename)')" Condition="%(ManagedAssemblyToLink.TrimMode) == 'copy'" />
<_IlcConditionallyRootedAssemblies Include="@(ManagedAssemblyToLink->'%(Filename)')" Condition="%(ManagedAssemblyToLink.TrimMode) == 'copyused'" />
<_IlcTrimmedAssemblies Include="@(ManagedAssemblyToLink->'%(Filename)')" Condition="%(ManagedAssemblyToLink.TrimMode) == 'link'" />
<_IlcSingleWarnAssemblies Include="@(ManagedAssemblyToLink->'%(Filename)')" Condition="%(ManagedAssemblyToLink.TrimmerSingleWarn) == 'true'" />
<_IlcNoSingleWarnAssemblies Include="@(ManagedAssemblyToLink->'%(Filename)')" Condition="%(ManagedAssemblyToLink.TrimmerSingleWarn) == 'false'" />
</ItemGroup>

<PropertyGroup>
Expand Down
8 changes: 6 additions & 2 deletions src/libraries/oob-trim.proj
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,13 @@
<OOBILLinkArgs Condition="'@(OOBLibrarySuppressionsXml)' != ''" >$(OOBILLinkArgs) --link-attributes "@(OOBLibrarySuppressionsXml->'%(FullPath)', '" --link-attributes "')"</OOBILLinkArgs>
</PropertyGroup>

<ItemGroup>
<_OOBRootAssemblyName Include="@(OOBAssemblyToTrim->'%(Filename)')" />
</ItemGroup>

<MakeDir Directories="$(OOBAssembliesTrimDir)" />
<ILLink AssemblyPaths=""
RootAssemblyNames="@(OOBAssemblyToTrim)"
<ILLink AssemblyPaths="@(OOBAssemblyToTrim)"
RootAssemblyNames="@(_OOBRootAssemblyName)"
ReferenceAssemblyPaths="@(OOBAssemblyReference)"
OutputDirectory="$(OOBAssembliesTrimDir)"
ExtraArgs="$(OOBILLinkArgs)"
Expand Down
7 changes: 5 additions & 2 deletions src/libraries/sfx-finish.proj
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,14 @@

<ItemGroup>
<SharedFrameworkAssembly RootMode="library" />
<_SharedFrameworkRootAssemblyName Include="@(SharedFrameworkAssembly->'%(Filename)')">
<RootMode>library</RootMode>
</_SharedFrameworkRootAssemblyName>
</ItemGroup>

<MakeDir Directories="$(SharedFrameworkAssembliesTrimDir)" />
<ILLink AssemblyPaths=""
RootAssemblyNames="@(SharedFrameworkAssembly)"
<ILLink AssemblyPaths="@(SharedFrameworkAssembly)"
RootAssemblyNames="@(_SharedFrameworkRootAssemblyName)"
OutputDirectory="$(SharedFrameworkAssembliesTrimDir)"
ExtraArgs="$(SharedFrameworkILLinkArgs)"
ToolExe="$(_DotNetHostFileName)"
Expand Down
2 changes: 1 addition & 1 deletion src/mono/browser/build/BrowserWasmApp.targets
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
<!-- When trimming non-exe projects, root the whole intermediate assembly. -->
<Target Name="_RootEntireIntermediateAssembly" AfterTargets="PrepareForILLink" BeforeTargets="_RunILLink" Condition="'$(RuntimeIdentifier)' == 'browser-wasm' And '$(OutputType)' == 'Library'">
<ItemGroup>
<TrimmerRootAssembly Condition="'%(Identity)' == '@(IntermediateAssembly)'">
<TrimmerRootAssembly Condition="'%(Identity)' == '$(AssemblyName)'">
<RootMode>all</RootMode>
</TrimmerRootAssembly>
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@

<TrimmerRootAssembly
Condition="'%(AppleAssembliesToBundle.FileName)%(AppleAssembliesToBundle.Extension)' == '$(AssemblyName).dll'"
Include="%(AppleAssembliesToBundle.Identity)" />
Include="%(AppleAssembliesToBundle.FileName)" />
<!-- PrepareForILLink target sets the IntermediateAssembly as an entry point for ILLink
which doesn't exist at the path when BuildTestsOnHelix -->
<IntermediateAssembly Remove="@(IntermediateAssembly)" />
Expand Down
2 changes: 1 addition & 1 deletion src/tools/illink/src/ILLink.Shared/SharedStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@
<value>Root assembly could not be found.</value>
</data>
<data name="RootAssemblyCouldNotBeFoundMessage" xml:space="preserve">
<value>Root assembly '{0}' could not be found.</value>
<value>Root assembly with name '{0}' could not be found.</value>
</data>
<data name="XmlDescriptorCouldNotBeFoundTitle" xml:space="preserve">
<value>XML descriptor file could not be found'.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ Copyright (c) .NET Foundation. All rights reserved.

<!-- Root the main assembly entry point. -->
<ItemGroup>
<TrimmerRootAssembly Include="@(IntermediateAssembly)" RootMode="EntryPoint" />
<TrimmerRootAssembly Include="@(IntermediateAssembly->'%(Filename)')" RootMode="EntryPoint" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.IO;
using ILLink.Shared;
using Mono.Cecil;

namespace Mono.Linker.Steps
{
public class RootAssemblyInput : BaseStep
{
readonly string fileName;
readonly string assemblyName;
readonly AssemblyRootMode rootMode;

public RootAssemblyInput(string fileName, AssemblyRootMode rootMode)
public RootAssemblyInput(string assemblyName, AssemblyRootMode rootMode)
{
this.fileName = fileName;
this.assemblyName = assemblyName;
this.rootMode = rootMode;
}

protected override void Process()
{
AssemblyDefinition? assembly = LoadAssemblyFile();
AssemblyDefinition? assembly = LoadAssemblyByName();
if (assembly == null)
return;

Expand Down Expand Up @@ -105,23 +104,11 @@ protected override void Process()
}
}

AssemblyDefinition? LoadAssemblyFile()
AssemblyDefinition? LoadAssemblyByName()
{
AssemblyDefinition? assembly;

if (File.Exists(fileName))
{
assembly = Context.Resolver.GetAssembly(fileName);
Context.Resolver.CacheAssembly(assembly);
return assembly;
}

//
// Quirks mode for netcore to support passing ambiguous assembly name
//
assembly = Context.TryResolve(fileName);
var assembly = Context.TryResolve(assemblyName);
if (assembly == null)
Context.LogError(null, DiagnosticId.RootAssemblyCouldNotBeFound, fileName);
Context.LogError(null, DiagnosticId.RootAssemblyCouldNotBeFound, assemblyName);

return assembly;
}
Expand Down
12 changes: 3 additions & 9 deletions src/tools/illink/src/linker/Linker/Driver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -750,15 +750,9 @@ protected int SetupContext(ILogger? customLogger = null)
}
case "a":
{
if (!GetStringParam(token, out string? assemblyFile))
if (!GetStringParam(token, out string? assemblyName))
return -1;

if (!File.Exists(assemblyFile) && assemblyFile.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase))
{
context.LogError(null, DiagnosticId.RootAssemblyCouldNotBeFound, assemblyFile);
return -1;
}

AssemblyRootMode rmode = AssemblyRootMode.AllMembers;
var rootMode = GetNextStringValue();
if (rootMode != null)
Expand All @@ -770,7 +764,7 @@ protected int SetupContext(ILogger? customLogger = null)
rmode = parsed_rmode.Value;
}

inputs.Add(new RootAssemblyInput(assemblyFile, rmode));
inputs.Add(new RootAssemblyInput(assemblyName, rmode));
continue;
}
case "b":
Expand Down Expand Up @@ -1460,7 +1454,7 @@ static void Usage()
Console.WriteLine(_linker);

Console.WriteLine($"illink [options] {resolvers}");
Console.WriteLine(" -a FILE [MODE] Assembly file used as root assembly with optional MODE value to alter default root mode");
Console.WriteLine(" -a ASSEMBLYNAME [MODE] Assembly name used as root assembly with optional MODE value to alter default root mode");
Console.WriteLine(" Mode can be one of the following values");
Console.WriteLine(" all: Keep all members in root assembly");
Console.WriteLine(" default: Use entry point for applications and all members for libraries");
Expand Down
2 changes: 1 addition & 1 deletion src/tools/illink/test/ILLink.Tasks.Tests/Mock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public IEnumerable<string> GetRootAssemblies()
if (!(step is RootAssemblyInput))
continue;

var assemblyName = (string)typeof(RootAssemblyInput).GetField("fileName", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(step);
var assemblyName = (string)typeof(RootAssemblyInput).GetField("assemblyName", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(step);
if (assemblyName == null)
continue;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Mono.Linker.Tests.Cases.BCLFeatures.ETW
{
[Reference("System.Diagnostics.Tracing.dll")]
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "test", "library")]
[KeptMember(".ctor()")]
public class CustomLibraryEventSource
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

namespace Mono.Linker.Tests.Cases.CommandLine;

[SetupLinkerArgument("-a", "test.exe", "entrypoint")]
[SetupLinkerArgument("-a", "../input/test.exe", "entrypoint")]
[SetupLinkerArgument("-a", "test", "entrypoint")]
[SetupLinkerArgument("-a", "test", "entrypoint")]
public class DuplicateRootAssembly
{
public static void Main()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ namespace Mono.Linker.Tests.Cases.CommandLine;

[ExpectNonZeroExitCode(1)]
[SetupCompileBefore("other.exe", new[] { "Dependencies/MultipleEntryPointRoots_Lib.cs" })]
[SetupLinkerArgument("-a", "test.exe", "entrypoint")]
[SetupLinkerArgument("-a", "other.exe", "entrypoint")]
[SetupLinkerArgument("-a", "test", "entrypoint")]
[SetupLinkerArgument("-a", "other", "entrypoint")]
[LogContains("IL1048")]
[NoLinkedOutput]
public class MultipleEntryPointRoots
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
namespace Mono.Linker.Tests.Cases.Inheritance.Interfaces
{
[SkipUnresolved(true)]
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "library.dll", "library")]
[SetupLinkerArgument("-a", "test", "library")]
[SetupLinkerArgument("-a", "library", "library")]
[TestCaseRequirements(TestRunCharacteristics.SupportsDefaultInterfaceMethods, "Requires support for default interface methods")]
[Define("IL_ASSEMBLY_AVAILABLE")]
[SetupCompileBefore("library.dll", new[] { "Dependencies/InterfaceImplementedThroughBaseInterface.il" })]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Mono.Linker.Tests.Cases.Inheritance.Interfaces.OnReferenceType
[SetupCompileBefore("copy.dll", new[] { typeof(InterfaceTypeInOtherUsedOnlyByCopiedAssembly_Copy) }, new[] { "linked.dll" })]

[SetupLinkerAction("copy", "copy")]
[SetupLinkerArgument("-a", "copy.dll")]
[SetupLinkerArgument("-a", "copy")]

[KeptTypeInAssembly("linked.dll", typeof(InterfaceTypeInOtherUsedOnlyByCopiedAssembly_Link.IFoo))]
[KeptMemberInAssembly("copy.dll", typeof(InterfaceTypeInOtherUsedOnlyByCopiedAssembly_Copy.A), "Method()")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace Mono.Linker.Tests.Cases.Inheritance.Interfaces.OnReferenceType
[SetupCompileBefore("copy.dll", new[] { typeof(InterfaceTypeInOtherUsedOnlyByCopiedAssemblyExplicit_Copy) }, new[] { "linked.dll" })]

[SetupLinkerAction("copy", "copy")]
[SetupLinkerArgument("-a", "copy.dll")]
[SetupLinkerArgument("-a", "copy")]

[KeptMemberInAssembly("linked.dll", typeof(InterfaceTypeInOtherUsedOnlyByCopiedAssemblyExplicit_Link.IFoo), "Method()")]
[KeptMemberInAssembly("copy.dll", typeof(InterfaceTypeInOtherUsedOnlyByCopiedAssemblyExplicit_Copy.A), "Mono.Linker.Tests.Cases.Inheritance.Interfaces.Dependencies.InterfaceTypeInOtherUsedOnlyByCopiedAssemblyExplicit_Link.IFoo.Method()")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Mono.Linker.Tests.Cases.Inheritance.Interfaces.StaticInterfaceMethods
{
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "test", "library")]
public static class StaticAbstractInterfaceMethodsLibrary
{
public static void Main()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Mono.Linker.Tests.Cases.Inheritance.Interfaces.StaticInterfaceMethods
{
[SetupCompileBefore("library.dll", new[] { "Dependencies/Library.cs" })]
[SetupLinkerAction("skip", "library")]
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "test", "library")]
public static class StaticVirtualInterfaceMethodsInPreservedScopeLibrary
{
[Kept]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Mono.Linker.Tests.Cases.Inheritance.Interfaces.StaticInterfaceMethods
{
[SetupCompileBefore("library.dll", new[] { "Dependencies/Library.cs" })]
[SetupLinkerAction("skip", "library")]
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "test", "library")]
public static class StaticVirtualInterfaceMethodsLibrary
{
[Kept]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Mono.Linker.Tests.Cases.Libraries
[KeptAttributeAttribute(typeof(IgnoreTestCaseAttribute), By = Tool.Trimmer)]
[SetupCompileBefore("copylibrary.dll", new[] { "Dependencies/CopyLibrary.cs" }, removeFromLinkerInput: true)]
[SkipUnresolved(true)]
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "test", "library")]
[SetupLinkerArgument("--enable-opt", "ipconstprop")]
[VerifyMetadataNames]
public class LibraryWithUnresolvedInterfaces
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace Mono.Linker.Tests.Cases.Libraries
new string[] { "Dependencies/RootAllLibrary_Substitutions.xml", "ILLink.Substitutions.xml" },
})]

[SetupLinkerArgument("-a", "library.dll")]
[SetupLinkerArgument("-a", "library")]
[IgnoreSubstitutions(false)]
[IgnoreLinkAttributes(false)]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace Mono.Linker.Tests.Cases.Libraries
[KeptAttributeAttribute(typeof(IgnoreTestCaseAttribute), By = Tool.Trimmer)]
[SetupCompileBefore("copylibrary.dll", new[] { "Dependencies/CopyLibrary.cs" })]
[SetupLinkerAction("copy", "copylibrary")]
[SetupLinkerArgument("-a", "test.exe", "library")]
[SetupLinkerArgument("-a", "test", "library")]
[SetupLinkerArgument("--enable-opt", "ipconstprop")]
[VerifyMetadataNames]
[SetupLinkerArgument("--feature", "Mono.Linker.Tests.Cases.Libraries.RootLibrary.FeatureGuardSubstitutionsTest.FeatureSwitch", "false")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ namespace Mono.Linker.Tests.Cases.Libraries

[SetupCompileBefore("library.dll", new[] { "Dependencies/RootLibraryVisibleForwarders_Lib.cs" }, outputSubFolder: "isolated")]
[SetupLinkerLinkPublicAndFamily]
[SetupLinkerArgument("-a", "isolated/library.dll", "visible")] // Checks for no-eager exported type resolving
[SetupLinkerArgument("-reference", "isolated/library.dll")]
[SetupLinkerArgument("-a", "library", "visible")] // Checks for no-eager exported type resolving
[Define("RootLibraryVisibleForwarders")]

[Kept]
Expand Down
Loading
Loading