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; }