microsoft / Microsoft.IO.RecyclableMemoryStream

A library to provide pooling for .NET MemoryStream objects to improve application performance.
MIT License
1.98k stars 205 forks source link

Missing `[RequiresUnreferencedCodeAttribute]` annotation for trimming #349

Open zeroskyx opened 2 months ago

zeroskyx commented 2 months ago

Greetings,

due to the call of this.WriteEvent, the library throws trim warnings since RequiresUnreferencedCodeAttribute is not currently propagated to the invoking methods.

Minimal reproduction

  1. Create new console app: dotnet new console
  2. Add RecycleableMemoryStream package: dotnet add package Microsoft.IO.RecyclableMemoryStream
  3. Replace contents of Program.cs with: _ = new Microsoft.IO.RecyclableMemoryStreamManager();
  4. Publish trimmed assembly, and show all trim warnings: dotnet publish -p:PublishTrimmed=true -p:EnableTrimAnalyzer=true -p:TrimmerSingleWarn=false

Expected result

The compilation and trimming concludes without any warnings

Actual result

The compilation emits trim warnings such as: /_/src/Events.cs(83,21): Trim analysis warning IL2026: Microsoft.IO.RecyclableMemoryStreamManager.Events.MemoryStreamCreated(Guid, String, Int64, Int64): Using member 'System.Diagnostics.Tracing.EventSource.WriteEvent(Int32, Object[])' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. EventSource will serialize the whole object graph. Trimmer will not safely handle this case because properties may be trimmed. /_/src/Events.cs(235,21): Trim analysis warning IL2026: Microsoft.IO.RecyclableMemoryStreamManager.Events.MemoryStreamDiscardBuffer(Guid, String, RecyclableMemoryStreamManager.Events.MemoryStreamBufferType, RecyclableMemoryStreamManager.Events.MemoryStreamDiscardReason, Int64, Int64, Int64, Int64, Int64, Int64): Using member 'System.Diagnostics.Tracing.EventSource.WriteEvent(Int32, Object[])' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. EventSource will serialize the whole object graph. Trimmer will not safely handle this case because properties may be trimmed.

Adding [RequiresUnreferencedCodeAttribute] to all methods calling this.WriteEvent would properly forward the trim warnings, not causing the library to produce trim warnings.

benmwatson commented 2 months ago

Thanks for reporting this. I will try to look at this and a few other issues for RMS in the next couple of weeks, unless you'd like to submit a PR.

zeroskyx commented 2 months ago

Hi @benmwatson,

thanks for the feedback. I've opened a PR that uses a new primitive available in .NET 8.0 that fixes the problem with the potentially dynamic types.

I've added net8.0 to the project types -- you might have to add that to the nuget build pipeline.

All the best -Simon