diff --git a/projects/RabbitMQ.Client/RabbitMQ.Client.csproj b/projects/RabbitMQ.Client/RabbitMQ.Client.csproj index 68ebb42a02..6373d5d5c1 100644 --- a/projects/RabbitMQ.Client/RabbitMQ.Client.csproj +++ b/projects/RabbitMQ.Client/RabbitMQ.Client.csproj @@ -4,6 +4,7 @@ net6.0;netstandard2.0 $(NoWarn);CS1591 true + true RabbitMQ Client Library for .NET VMware VMware, Inc. or its affiliates. diff --git a/projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs b/projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs index 396d05a227..40f58a5cc6 100644 --- a/projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs +++ b/projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs @@ -31,6 +31,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; namespace RabbitMQ.Client { @@ -39,7 +40,7 @@ public interface ICredentialsRefresher ICredentialsProvider Register(ICredentialsProvider provider, NotifyCredentialRefreshed callback); bool Unregister(ICredentialsProvider provider); - delegate void NotifyCredentialRefreshed(bool succesfully); + delegate void NotifyCredentialRefreshed(bool successfully); } [EventSource(Name = "TimerBasedCredentialRefresher")] @@ -52,11 +53,17 @@ public class TimerBasedCredentialRefresherEventSource : EventSource [Event(2)] public void Unregistered(string name) => WriteEvent(2, "UnRegistered", name); [Event(3)] +#if NET6_0_OR_GREATER + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe")] +#endif public void ScheduledTimer(string name, double interval) => WriteEvent(3, "ScheduledTimer", name, interval); [Event(4)] public void TriggeredTimer(string name) => WriteEvent(4, "TriggeredTimer", name); [Event(5)] - public void RefreshedCredentials(string name, bool succesfully) => WriteEvent(5, "RefreshedCredentials", name, succesfully); +#if NET6_0_OR_GREATER + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe")] +#endif + public void RefreshedCredentials(string name, bool successfully) => WriteEvent(5, "RefreshedCredentials", name, successfully); } public class TimerBasedCredentialRefresher : ICredentialsRefresher diff --git a/projects/RabbitMQ.Client/client/logging/RabbitMqClientEventSource.cs b/projects/RabbitMQ.Client/client/logging/RabbitMqClientEventSource.cs index d7ddc75387..6266b49aae 100644 --- a/projects/RabbitMQ.Client/client/logging/RabbitMqClientEventSource.cs +++ b/projects/RabbitMQ.Client/client/logging/RabbitMqClientEventSource.cs @@ -30,6 +30,7 @@ //--------------------------------------------------------------------------- using System; +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; namespace RabbitMQ.Client.Logging @@ -62,31 +63,30 @@ public void Warn(string message) if (IsEnabled()) WriteEvent(2, message); } -#if NET452 - [Event(3, Message = "ERROR", Keywords = Keywords.Log, Level = EventLevel.Error)] - public void Error(string message, string detail) - { - if(IsEnabled()) - this.WriteEvent(3, message, detail); - } -#else + [Event(3, Message = "ERROR", Keywords = Keywords.Log, Level = EventLevel.Error)] public void Error(string message, RabbitMqExceptionDetail ex) { if (IsEnabled()) + { +#if NET6_0_OR_GREATER + WriteExceptionEvent(message, ex); + + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "The properties are preserved with the DynamicallyAccessedMembers attribute.")] + void WriteExceptionEvent<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T>(string message, T ex) + { + WriteEvent(3, message, ex); + } +#else WriteEvent(3, message, ex); - } #endif + } + } [NonEvent] public void Error(string message, Exception ex) { - -#if NET452 - Error(message, ex.ToString()); -#else Error(message, new RabbitMqExceptionDetail(ex)); -#endif } } } diff --git a/projects/RabbitMQ.Client/client/logging/RabbitMqExceptionDetail.cs b/projects/RabbitMQ.Client/client/logging/RabbitMqExceptionDetail.cs index fa1f2f11ce..e61814569d 100644 --- a/projects/RabbitMQ.Client/client/logging/RabbitMqExceptionDetail.cs +++ b/projects/RabbitMQ.Client/client/logging/RabbitMqExceptionDetail.cs @@ -60,6 +60,10 @@ public RabbitMqExceptionDetail(IDictionary ex) } } + // NOTE: This type is used to write EventData in RabbitMqClientEventSource.Error. To make it trim-compatible, these properties are preserved + // in RabbitMqClientEventSource. If RabbitMqExceptionDetail gets a property that is a complex type, we need to ensure the nested properties are + // preserved as well. + public string Type { get; } public string Message { get; } public string StackTrace { get; }