Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[msbuild] Add ILStrip'ing for net6 applications. Fixes #11445. #12563

Merged
merged 29 commits into from
Oct 5, 2021

Conversation

chamons
Copy link
Contributor

@chamons chamons commented Aug 26, 2021

  • Controlled by EnableAssemblyILStripping which defaults to true
  • Integration test included

Before - https://gist.github.com/chamons/c7886f7bacbc2e5ac5966e4251d13e71
After - https://gist.github.com/chamons/148e1bef22fa336f953f3d02dcf20667

859,136 -> 527,872 managed

Fixes #11445.

chamons and others added 3 commits August 25, 2021 14:31
- Controled by EnableAssemblyILStripping which defaults to true
- Integration test included

Before - https://gist.github.com/chamons/c7886f7bacbc2e5ac5966e4251d13e71
After - https://gist.github.com/chamons/148e1bef22fa336f953f3d02dcf20667

859,136 -> 527,872 managed
Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
@chamons
Copy link
Contributor Author

chamons commented Aug 26, 2021

Those from #12558 see the last commit for changes.

I've now run this locally in sim and device, and hand tested the follow cases:

  • Sim - no strip
  • Device Debug - no strip
  • Device Release - strip
  • Device Release set MtouchInterpreter - no strip
  • Device Release /p:MtouchExtraArgs=--nostrip=true - no strip
  • Device Release /p:MtouchExtraArgs=--nostrip=false - strip
  • Device Deug /p:MtouchExtraArgs=--nostrip=false - strip

@chamons chamons requested a review from spouliot August 26, 2021 19:28
@@ -53,7 +53,11 @@ build-dotnet: $(TARGETS)
$(DOTNET6) build size-comparison/MySingleView/dotnet/MySingleView.csproj --runtime ios-arm64 $(COMMON_ARGS) /bl:$@.binlog $(MSBUILD_VERBOSITY)

run-dotnet: $(TARGETS)
$(DOTNET6) build -t:Run size-comparison/MySingleView/dotnet/MySingleView.csproj --runtime ios-arm64 $(COMMON_ARGS)
$(DOTNET6) build -t:Run size-comparison/MySingleView/dotnet/MySingleView.csproj --runtime ios-arm64 $(COMMON_ARGS) /bl:$@.binlog $(MSBUILD_VERBOSITY)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Convince mostly. Writing out log is almost free, and being able to test sim was nice.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Target strip-dotnet: can also be removed now :)

and the README updated to document how to preserve the IL for analysis (it's already done for legacy)

@chamons chamons added the note-highlight Worth calling out specifically in release notes label Aug 26, 2021
@chamons
Copy link
Contributor Author

chamons commented Aug 26, 2021

You know, let me try removing that and see what needs to change.

@chamons
Copy link
Contributor Author

chamons commented Aug 26, 2021

So turns out my more generic conditions work in either case, so I could just remove it.

@@ -130,6 +133,10 @@ public override bool Execute ()
xml = new List<string> ();
xml.Add (value);
break;
case "nostrip":
// Output is EnableAssemblyILStripping so we enable if --nostring=false and disable if true
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo: nostring -> nostrip

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@@ -53,7 +53,11 @@ build-dotnet: $(TARGETS)
$(DOTNET6) build size-comparison/MySingleView/dotnet/MySingleView.csproj --runtime ios-arm64 $(COMMON_ARGS) /bl:$@.binlog $(MSBUILD_VERBOSITY)

run-dotnet: $(TARGETS)
$(DOTNET6) build -t:Run size-comparison/MySingleView/dotnet/MySingleView.csproj --runtime ios-arm64 $(COMMON_ARGS)
$(DOTNET6) build -t:Run size-comparison/MySingleView/dotnet/MySingleView.csproj --runtime ios-arm64 $(COMMON_ARGS) /bl:$@.binlog $(MSBUILD_VERBOSITY)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Target strip-dotnet: can also be removed now :)

and the README updated to document how to preserve the IL for analysis (it's already done for legacy)

<_StrippedAssemblies Include="@(_AssembliesToBeStripped->'%(OutputPath)')" >
</_StrippedAssemblies>
</ItemGroup>
<ILStrip Assemblies="@(_AssembliesToBeStripped)" />
Copy link
Contributor

@emaf emaf Aug 27, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When building from Windows this won't be executed remotely because it's missing the SessionId property. Does this need to be executed on a Mac? Do we own this task?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The runtime team owns it: https://github.com/dotnet/runtime/pull/57359/files

And yes, this has to be executed on the Mac (it happens after the AOT compiler has executed, but before we sign the final .app)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, this won't work then, for executing a task remotely we need to add the SessionId property and the logic to execute it remotely based on that value. We had the same problem with ILLink, and we ended up inheriting from the original task to add support for remoting it, see https://github.com/xamarin/xamarin-macios/blob/main/msbuild/Xamarin.iOS.Tasks/Tasks/ILLink.cs and https://github.com/xamarin/xamarin-macios/blob/main/msbuild/Xamarin.iOS.Tasks.Core/Tasks/ILLinkBase.cs. The base class is adding input and output properties for all the files that need to be copied to the Mac and the output ones that need to be created on Windows. I'm not sure if there's a better way for doing this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@emaf I think @chamons can try to implement this but can you help us testing it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Taking a stab at this.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dalexsoto I'll be out next week, but @mauroa should be able to help with any questions. Please keep in mind he has many things in his plate already, but he'll try to test this from Windows once the changes are ready.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fixed.

@vs-mobiletools-engineering-service2
Copy link
Collaborator

❌ [PR Build] Tests failed on Build ❌

Tests failed on Build.

API diff

✅ API Diff from stable

View API diff

API & Generator diff

API Diff (from PR only) (no change)
Generator Diff (only version changes)

GitHub pages

Results can be found in the following github pages (it might take some time to publish):

Test results

3 tests failed, 140 tests passed.

Failed tests

  • link sdk/Mac Catalyst/Debug: TimedOut (Execution timed out after 1200 seconds.
    No test log file was produced)
  • introspection/iOS Unified 64-bits - simulator/Debug [dotnet]: Failed
  • introspection/iOS Unified 64-bits - simulator/Debug (iOS 11.4) [dotnet]: Failed

Pipeline on Agent XAMBOT-1109.BigSur'
Merge aea669e into 1394420

@rolfbjarne rolfbjarne added the run-dotnet-tests Run all the .NET tests label Aug 27, 2021
dotnet/targets/Xamarin.Shared.Sdk.targets Show resolved Hide resolved
<_StrippedAssemblies Include="@(_AssembliesToBeStripped->'%(OutputPath)')" >
</_StrippedAssemblies>
</ItemGroup>
<ILStrip Assemblies="@(_AssembliesToBeStripped)" />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The runtime team owns it: https://github.com/dotnet/runtime/pull/57359/files

And yes, this has to be executed on the Mac (it happens after the AOT compiler has executed, but before we sign the final .app)

@@ -1062,6 +1062,7 @@ Copyright (C) 2018 Microsoft. All rights reserved.
<Output TaskParameter="Registrar" PropertyName="_BundlerRegistrar" />
<Output TaskParameter="Verbosity" PropertyName="_BundlerVerbosity" />
<Output TaskParameter="XmlDefinitions" ItemName="_BundlerXmlDefinitions" />
<Output TaskParameter="NoStrip" PropertyName="EnableAssemblyILStripping" />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This task should take EnableAssemblyILStripping as input as well, otherwise it won't be possible for users to override the default by setting EnableAssemblyILStripping to something.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure this is correct.

I hacked up a test project: https://gist.github.com/chamons/abe82c128d909df53a1780c792394dab to check

In it, I invoke ParseBundlerArguments with some _BundlerArguments and EnableAssemblyILStripping preset. I print before and after, and I don't think it overrides (with 0f13eb3).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thoughts on ^?

tests/dotnet/UnitTests/PostBuildTest.cs Show resolved Hide resolved
tests/dotnet/UnitTests/PostBuildTest.cs Outdated Show resolved Hide resolved
tests/dotnet/UnitTests/PostBuildTest.cs Outdated Show resolved Hide resolved
tests/dotnet/UnitTests/PostBuildTest.cs Outdated Show resolved Hide resolved
tests/dotnet/UnitTests/PostBuildTest.cs Outdated Show resolved Hide resolved
tests/dotnet/UnitTests/PostBuildTest.cs Outdated Show resolved Hide resolved
<PropertyGroup>
<_StrippedAssemblyDirectory>$(DeviceSpecificIntermediateOutputPath)\stripped</_StrippedAssemblyDirectory>
</PropertyGroup>
<MakeDir Directories="$(_StrippedAssemblyDirectory)" />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is missing the SessionId parameter and the IsMacEnabled condition, so when building from Windows this will only be executed on Windows. Like this:

<MakeDir SessionId="$(BuildSessionId)" Condition="'$(IsMacEnabled)' == 'true'" Directories="$(_AppResourcesPath)" />

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@rolfbjarne rolfbjarne changed the title [msbuild] Add ILStrip'ing for net6 applications [msbuild] Add ILStrip'ing for net6 applications. Fixes #11445. Aug 27, 2021
chamons and others added 4 commits August 27, 2021 09:23
@vs-mobiletools-engineering-service2
Copy link
Collaborator

🔥 Tests failed catastrophically on Build (no summary found). 🔥

Result file $(TEST_SUMMARY_PATH) not found.

Pipeline on Agent
Merge a027e74 into 5cd7c96

@dalexsoto
Copy link
Member

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@chamons
Copy link
Contributor Author

chamons commented Sep 28, 2021

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@mauroa
Copy link
Contributor

mauroa commented Sep 29, 2021

@dalexsoto @chamons @rolfbjarne I don't see new packages for the latest changes/fixes in the CI build. Did something go wrong? I would need to have them in order to test VS

@rolfbjarne
Copy link
Member

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@rolfbjarne
Copy link
Member

@mauroa our CI isn't in a nice mood 😒 I started another attempt, hopefully it works this time (third time's the charm!)

@vs-mobiletools-engineering-service2
Copy link
Collaborator

❌ [PR Build] Tests failed on Build ❌

Tests failed on Build.

API diff

✅ API Diff from stable

View API diff

API & Generator diff

API Diff (from PR only) (no change)
Generator Diff (only version changes)

GitHub pages

Results can be found in the following github pages (it might take some time to publish):

Test results

3 tests failed, 134 tests passed.

Failed tests

  • monotouch-test/Mac [dotnet]/Debug (static registrar) [dotnet]: Failed (Test run failed.
    Tests run: 2491 Passed: 2403 Inconclusive: 10 Failed: 1 Ignored: 87)
  • monotouch-test/Mac Catalyst [dotnet]/Debug [dotnet]: Failed (Tests run: 2658 Passed: 2492 Inconclusive: 35 Failed: 1 Ignored: 165)
  • monotouch-test/tvOS - simulator/Debug (static registrar) [dotnet]: Failed

Pipeline on Agent XAMBOT-1101.BigSur'
Merge f215ae8 into 071b665

@vs-mobiletools-engineering-service2
Copy link
Collaborator

❌ [PR Build] Tests failed on Build ❌

Tests failed on Build.

API diff

✅ API Diff from stable

View API diff

API & Generator diff

API Diff (from PR only) (no change)
Generator Diff (only version changes)

GitHub pages

Results can be found in the following github pages (it might take some time to publish):

Test results

1 tests failed, 136 tests passed.

Failed tests

  • monotouch-test/Mac Catalyst [dotnet]/Debug [dotnet]: Failed (Tests run: 2658 Passed: 2490 Inconclusive: 35 Failed: 3 Ignored: 165)

Pipeline on Agent XAMBOT-1094.BigSur'
Merge ca0cab7 into 7a090e9

@@ -24,6 +25,10 @@
<!-- We need the net472 impl, otherwise the Build agent needs to be a net5.0 app -->
<HintPath>$(PkgMicrosoft_NET_ILLink_Tasks)\tools\net472\ILLink.Tasks.dll</HintPath>
</Reference>
<Reference Include="ILStrip">
<!-- We need the net472 impl, otherwise the Build agent needs to be a net5.0 app -->
<HintPath>$(PkgMicrosoft_NET_Runtime_MonoTargets_Sdk)\tasks\net472\ILStrip.dll</HintPath>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI, for net7 I'm looking at consolidating the MonoTargets tasks into a single assembly dotnet/runtime#59720

@chamons
Copy link
Contributor Author

chamons commented Oct 4, 2021

1 test failure is known:

image

https://github.com/xamarin/maccore/issues/2443

The other two seem obviously related.

@chamons
Copy link
Contributor Author

chamons commented Oct 4, 2021

@mauroa - I just had to re-merge due to a test file conflict but hopefully the last build is good enough to test today?

@vs-mobiletools-engineering-service2
Copy link
Collaborator

❌ [PR Build] Tests failed on Build ❌

Tests failed on Build.

API diff

✅ API Diff from stable

View API diff

API & Generator diff

API Diff (from PR only) (no change)
Generator Diff (only version changes)

GitHub pages

Results can be found in the following github pages (it might take some time to publish):

Test results

2 tests failed, 135 tests passed.

Failed tests

  • monotouch-test/Mac Catalyst [dotnet]/Debug [dotnet]: Failed (Tests run: 2659 Passed: 2491 Inconclusive: 35 Failed: 3 Ignored: 165)
  • dont link/Mac Catalyst [dotnet]/Debug [dotnet]: TimedOut (Execution timed out after 1200 seconds.
    No test log file was produced)

Pipeline on Agent XAMBOT-1101.BigSur'
Merge f5c2845 into ee14ab7

@mauroa
Copy link
Contributor

mauroa commented Oct 5, 2021

@chamons @rolfbjarne @dalexsoto I tested with the latest build and I was able to successfully build a net6 ios app with ILStrip enabled. I think we are good to signoff and merge the PR if everything else is ok

@rolfbjarne
Copy link
Member

Test failures are unrelated

@chamons chamons merged commit a300dfc into xamarin:main Oct 5, 2021
@chamons chamons deleted the il_strip_net6 branch October 5, 2021 14:43
chamons added a commit to chamons/xamarin-macios that referenced this pull request Oct 22, 2021
- In a late minute change to the ILStrip PR (xamarin#12563) a change XVS support broke execution of Apps that were stripped
- Applications were broken because none of the stripped assemblies were actually copied into the bundle
- However, the tests still passed, because all assemblies that were there had no IL (zero assemblies total)

Now why did this happen?
- The stripped assemblies were changed to return via an msbuidl Output Element
- Output Element can return an Property or ItemGroup, depending if you use the PropertyName or ItemName attributes
- Unfortuntely I used PropertyName, when I expected an ItemGroup. So I silently had a property created instead.
- Thus zero items were added to the list of files to copy into the bundle
- Which was undetected as the test did not confirm files were copied in, and manual tests were not run so late into the PR (3 weeks after PR was opened)

How was it fixed?
- Correctly using ItemName on Output created a valid item group to reference
- However, that still failed with an absurdly confusing error:

 PATH/Microsoft.NET.Publish.targets(277,5): error MSB3024: Could not copy the file FILE to the destination file PATH, because the destination is a folder instead of a file. To copy the source file into a folder, consider using the DestinationFolder parameter instead of DestinationFiles.

- After a splunking through netcore targets, I found the metadata on these assemblies references really matters. Without it, they are not processed correctly at all.
- Thus, I updated ILStripBase to clone the existing metadata when changing the orignal assembly reference to the stripped path
- Finally, I corrected the test to assert that required files are copied in. I also manually ran our device test.
chamons added a commit to chamons/xamarin-macios that referenced this pull request Oct 22, 2021
- In a late minute change to the ILStrip PR (xamarin#12563) a change to support XVS support broke execution of Apps that were stripped
- Applications were broken because none of the stripped assemblies were actually copied into the bundle
- However, the tests still passed, because all assemblies that were there had no IL (zero assemblies total)

Now why did this happen?
- The stripped assemblies were changed to return via an msbuild Output Element
- Output Element can return an Property or ItemGroup, depending if you use the PropertyName or ItemName attributes
- Unfortunately I used PropertyName, when I expected an ItemGroup. So I silently had a property created instead.
- Thus zero items were added to the list of files to copy into the bundle
- Which was undetected as the test did not confirm files were copied in, and manual tests were not run so late into the PR (3 weeks after PR was opened)

How was it fixed?
- Correctly using ItemName on Output created a valid item group to reference
- However, that still failed with an absurdly confusing error:

 PATH/Microsoft.NET.Publish.targets(277,5): error MSB3024: Could not copy the file FILE to the destination file PATH, because the destination is a folder instead of a file. To copy the source file into a folder, consider using the DestinationFolder parameter instead of DestinationFiles.

- After a splunking through netcore targets, I found the metadata on these assemblies references really matters. Without it, they are not processed correctly at all.
- Thus, I updated ILStripBase to clone the existing metadata when changing the original assembly reference to the stripped path
- Finally, I corrected the test to assert that required files are copied in. I also manually ran our device test.
chamons added a commit that referenced this pull request Oct 25, 2021
* [net6] Fix ILStrip'ed apps to actually work again

- In a late minute change to the ILStrip PR (#12563) a change to support XVS support broke execution of Apps that were stripped
- Applications were broken because none of the stripped assemblies were actually copied into the bundle
- However, the tests still passed, because all assemblies that were there had no IL (zero assemblies total)

Now why did this happen?
- The stripped assemblies were changed to return via an msbuild Output Element
- Output Element can return an Property or ItemGroup, depending if you use the PropertyName or ItemName attributes
- Unfortunately I used PropertyName, when I expected an ItemGroup. So I silently had a property created instead.
- Thus zero items were added to the list of files to copy into the bundle
- Which was undetected as the test did not confirm files were copied in, and manual tests were not run so late into the PR (3 weeks after PR was opened)

How was it fixed?
- Correctly using ItemName on Output created a valid item group to reference
- However, that still failed with an absurdly confusing error:

 PATH/Microsoft.NET.Publish.targets(277,5): error MSB3024: Could not copy the file FILE to the destination file PATH, because the destination is a folder instead of a file. To copy the source file into a folder, consider using the DestinationFolder parameter instead of DestinationFiles.

- After a splunking through netcore targets, I found the metadata on these assemblies references really matters. Without it, they are not processed correctly at all.
- Thus, I updated ILStripBase to clone the existing metadata when changing the original assembly reference to the stripped path
- Finally, I corrected the test to assert that required files are copied in. I also manually ran our device test.

Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
vs-mobiletools-engineering-service2 pushed a commit to vs-mobiletools-engineering-service2/xamarin-macios that referenced this pull request Oct 25, 2021
- In a late minute change to the ILStrip PR (xamarin#12563) a change to support XVS support broke execution of Apps that were stripped
- Applications were broken because none of the stripped assemblies were actually copied into the bundle
- However, the tests still passed, because all assemblies that were there had no IL (zero assemblies total)

Now why did this happen?
- The stripped assemblies were changed to return via an msbuild Output Element
- Output Element can return an Property or ItemGroup, depending if you use the PropertyName or ItemName attributes
- Unfortunately I used PropertyName, when I expected an ItemGroup. So I silently had a property created instead.
- Thus zero items were added to the list of files to copy into the bundle
- Which was undetected as the test did not confirm files were copied in, and manual tests were not run so late into the PR (3 weeks after PR was opened)

How was it fixed?
- Correctly using ItemName on Output created a valid item group to reference
- However, that still failed with an absurdly confusing error:

 PATH/Microsoft.NET.Publish.targets(277,5): error MSB3024: Could not copy the file FILE to the destination file PATH, because the destination is a folder instead of a file. To copy the source file into a folder, consider using the DestinationFolder parameter instead of DestinationFiles.

- After a splunking through netcore targets, I found the metadata on these assemblies references really matters. Without it, they are not processed correctly at all.
- Thus, I updated ILStripBase to clone the existing metadata when changing the original assembly reference to the stripped path
- Finally, I corrected the test to assert that required files are copied in. I also manually ran our device test.
dalexsoto pushed a commit that referenced this pull request Oct 26, 2021
…rk again (#13106)

* [net6] Fix ILStrip'ed apps to actually work again

- In a late minute change to the ILStrip PR (#12563) a change to support XVS support broke execution of Apps that were stripped
- Applications were broken because none of the stripped assemblies were actually copied into the bundle
- However, the tests still passed, because all assemblies that were there had no IL (zero assemblies total)

Now why did this happen?
- The stripped assemblies were changed to return via an msbuild Output Element
- Output Element can return an Property or ItemGroup, depending if you use the PropertyName or ItemName attributes
- Unfortunately I used PropertyName, when I expected an ItemGroup. So I silently had a property created instead.
- Thus zero items were added to the list of files to copy into the bundle
- Which was undetected as the test did not confirm files were copied in, and manual tests were not run so late into the PR (3 weeks after PR was opened)

How was it fixed?
- Correctly using ItemName on Output created a valid item group to reference
- However, that still failed with an absurdly confusing error:

 PATH/Microsoft.NET.Publish.targets(277,5): error MSB3024: Could not copy the file FILE to the destination file PATH, because the destination is a folder instead of a file. To copy the source file into a folder, consider using the DestinationFolder parameter instead of DestinationFiles.

- After a splunking through netcore targets, I found the metadata on these assemblies references really matters. Without it, they are not processed correctly at all.
- Thus, I updated ILStripBase to clone the existing metadata when changing the original assembly reference to the stripped path
- Finally, I corrected the test to assert that required files are copied in. I also manually ran our device test.

* Update tests/dotnet/UnitTests/PostBuildTest.cs

Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>

Co-authored-by: Chris Hamons <chris.hamons@xamarin.com>
Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
do-not-merge Do not merge this pull request note-highlight Worth calling out specifically in release notes run-dotnet-tests Run all the .NET tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[dotnet] Missing mono-cil-strip (or alternative)
9 participants