-
Notifications
You must be signed in to change notification settings - Fork 385
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
Remove dependencies #2127
Remove dependencies #2127
Conversation
…encies count and self-contained app size
…pendency to System.Collections.Concurrent
… less reflection and drop non-generic collections support
Updated perf numbers for startup scenario benchmarks (https://github.com/adamsitnik/commandline-perf/tree/update): Default settingsBenchmarkDotNet=v0.13.4, OS=Windows 11 (10.0.22621.1413) EvaluateOverhead=False OutlierMode=DontRemove InvocationCount=1
|
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL3050", Justification = "https://github.com/dotnet/command-line-api/issues/1638")] | ||
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2091", Justification = "https://github.com/dotnet/command-line-api/issues/1638")] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand why the referenced issue is justification for suppressing these warnings. It might be better if we wrote it out here.
I believe you could fix IL2091
by annotating the T
with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
. See https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/fixing-warnings#dynamicallyaccessedmembers
{ | ||
if (typeof(T).IsArray) | ||
{ | ||
return (T?)(object)Array.CreateInstance(typeof(T).GetElementType()!, 0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should be able to use dotnet/runtime#76478 once it is implemented in .NET 8. That will allow us to do this without a warning.
genericTypeDefinition == typeof(IList<>) || | ||
genericTypeDefinition == typeof(ICollection<>)) | ||
{ | ||
return (T?)(object)Array.CreateInstance(typeof(T).GenericTypeArguments[0], 0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't guaranteed to work in a NativeAOT app. Just because the app uses a IList<double>
, it doesn't mean that double[]
's code is going to get preserved/generated.
At the cost of requiring the users to provide explicit custom parser for
Uri
,IPAddress
andIPEndPoint
and a removal of non-generic collections support I was able to remove following dependencies:The most tricky part was removing dependency to
System.Collections.dll
, which was caused by the fact that we were usingStack<T>
(it's generic, but not defined inSystem.Collections.Generic.dll
or CoreLib...)The only dependency that an app that uses S.CL has and a Hello World app does not, is
System.Linq
(and S.CL of course).For following app:
And
The number of files dropped from 34 to 29, size from 17.5 MB to 17.3.
For NativeAOT app the size dropped from 4.65 MB to 4.5 MB.
fixes #1794
Useful link for repeating the process in the future: dotnet/runtime#78671 (comment)