Skip to content

Commit

Permalink
Add Protocol Buffer serialization support
Browse files Browse the repository at this point in the history
  • Loading branch information
RJSonnenberg committed Jun 8, 2023
1 parent 312b8cd commit 11e22d5
Show file tree
Hide file tree
Showing 16 changed files with 853 additions and 22 deletions.
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
<PackageVersion Include="OpenTelemetry.Exporter.Jaeger" Version="1.4.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.4.0" />
<PackageVersion Include="prometheus-net" Version="6.0.0" />
<PackageVersion Include="protobuf-net" Version="3.2.26" />
<PackageVersion Include="Quartz" Version="3.6.2" />
<PackageVersion Include="Quartz.Extensions.Hosting" Version="3.6.2" />
<PackageVersion Include="Quartz.Plugins.TimeZoneConverter" Version="3.6.2" />
Expand Down
59 changes: 37 additions & 22 deletions MassTransit.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29613.14
# Visual Studio Version 17
VisualStudioVersion = 17.6.33723.286
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Persistence", "Persistence", "{56F516D7-BC3C-49E1-A639-83C5F14953F8}"
EndProject
Expand All @@ -25,12 +25,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Containers.Test
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".solution", ".solution", "{2C8A15FA-A445-4916-AAC2-3BE53AA247A7}"
ProjectSection(SolutionItems) = preProject
.github\workflows\build.yml = .github\workflows\build.yml
Directory.Build.props = Directory.Build.props
Directory.Packages.props = Directory.Packages.props
NuGet.README.md = NuGet.README.md
README.md = README.md
signing.props = signing.props
.github\workflows\build.yml = .github\workflows\build.yml
NuGet.README.md = NuGet.README.md
Directory.Packages.props = Directory.Packages.props
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scheduling", "Scheduling", "{FDC1A760-D4E5-44F4-B0D9-C19F2E14253A}"
Expand Down Expand Up @@ -121,37 +121,39 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.EventHubIntegra
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.EventHubIntegration.Tests", "tests\MassTransit.EventHubIntegration.Tests\MassTransit.EventHubIntegration.Tests.csproj", "{24CC1B47-AE01-4871-A939-2BF6EB789860}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Azure.Table", "src\Persistence\MassTransit.Azure.Table\MassTransit.Azure.Table.csproj", "{338E2B7E-4301-4547-9172-4415F739C029}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Azure.Table", "src\Persistence\MassTransit.Azure.Table\MassTransit.Azure.Table.csproj", "{338E2B7E-4301-4547-9172-4415F739C029}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Azure.Table.Tests", "tests\MassTransit.Azure.Table.Tests\MassTransit.Azure.Table.Tests.csproj", "{17E04A9B-5DB5-4857-99CD-E9AF22DA00E4}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Azure.Table.Tests", "tests\MassTransit.Azure.Table.Tests\MassTransit.Azure.Table.Tests.csproj", "{17E04A9B-5DB5-4857-99CD-E9AF22DA00E4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.GrpcTransport", "src\Transports\MassTransit.GrpcTransport\MassTransit.GrpcTransport.csproj", "{AF56509B-0B95-4ACE-9CFC-F9A79756C357}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.GrpcTransport", "src\Transports\MassTransit.GrpcTransport\MassTransit.GrpcTransport.csproj", "{AF56509B-0B95-4ACE-9CFC-F9A79756C357}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.GrpcTransport.Tests", "tests\MassTransit.GrpcTransport.Tests\MassTransit.GrpcTransport.Tests.csproj", "{082488F6-6322-462A-85D7-9E893A67B8CD}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.GrpcTransport.Tests", "tests\MassTransit.GrpcTransport.Tests\MassTransit.GrpcTransport.Tests.csproj", "{082488F6-6322-462A-85D7-9E893A67B8CD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Transports.Tests", "tests\MassTransit.Transports.Tests\MassTransit.Transports.Tests.csproj", "{7632EDAF-29A1-4E69-952F-C75D3BF34B3B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Transports.Tests", "tests\MassTransit.Transports.Tests\MassTransit.Transports.Tests.csproj", "{7632EDAF-29A1-4E69-952F-C75D3BF34B3B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Abstractions", "src\MassTransit.Abstractions\MassTransit.Abstractions.csproj", "{2CAF0C51-2F64-4EB0-8E27-AE3E0085CA75}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Abstractions", "src\MassTransit.Abstractions\MassTransit.Abstractions.csproj", "{2CAF0C51-2F64-4EB0-8E27-AE3E0085CA75}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.StateMachineVisualizer", "src\MassTransit.StateMachineVisualizer\MassTransit.StateMachineVisualizer.csproj", "{8CD4298E-962B-4D04-821D-274343099E83}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.StateMachineVisualizer", "src\MassTransit.StateMachineVisualizer\MassTransit.StateMachineVisualizer.csproj", "{8CD4298E-962B-4D04-821D-274343099E83}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Abstractions.Tests", "tests\MassTransit.Abstractions.Tests\MassTransit.Abstractions.Tests.csproj", "{AB188378-1BAC-4ECB-98A7-91E12C861381}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Abstractions.Tests", "tests\MassTransit.Abstractions.Tests\MassTransit.Abstractions.Tests.csproj", "{AB188378-1BAC-4ECB-98A7-91E12C861381}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.BenchmarkConsole", "tests\MassTransit.BenchmarkConsole\MassTransit.BenchmarkConsole.csproj", "{2B6ACCF2-0CAF-4152-901F-0048390971E4}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.BenchmarkConsole", "tests\MassTransit.BenchmarkConsole\MassTransit.BenchmarkConsole.csproj", "{2B6ACCF2-0CAF-4152-901F-0048390971E4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Benchmark", "tests\MassTransit.Benchmark\MassTransit.Benchmark.csproj", "{667E52D5-E1D9-49EE-B364-3CB7E43EE160}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Benchmark", "tests\MassTransit.Benchmark\MassTransit.Benchmark.csproj", "{667E52D5-E1D9-49EE-B364-3CB7E43EE160}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.Newtonsoft", "src\MassTransit.Newtonsoft\MassTransit.Newtonsoft.csproj", "{388085C8-1BC8-48F8-8EA2-3698FCB385E5}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Newtonsoft", "src\MassTransit.Newtonsoft\MassTransit.Newtonsoft.csproj", "{388085C8-1BC8-48F8-8EA2-3698FCB385E5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarking", "Benchmarking", "{BF384860-70ED-47F0-B276-13D2DA9ECD87}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.DynamoDbIntegration", "src\Persistence\MassTransit.DynamoDbIntegration\MassTransit.DynamoDbIntegration.csproj", "{186D6491-ECCD-49EB-8E99-AFD7AD6037D2}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.DynamoDbIntegration", "src\Persistence\MassTransit.DynamoDbIntegration\MassTransit.DynamoDbIntegration.csproj", "{186D6491-ECCD-49EB-8E99-AFD7AD6037D2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.DynamoDbIntegration.Tests", "tests\MassTransit.DynamoDbIntegration.Tests\MassTransit.DynamoDbIntegration.Tests.csproj", "{694E06CF-2842-4E71-8CD2-81FA7C1B3D13}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.DynamoDbIntegration.Tests", "tests\MassTransit.DynamoDbIntegration.Tests\MassTransit.DynamoDbIntegration.Tests.csproj", "{694E06CF-2842-4E71-8CD2-81FA7C1B3D13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.AmazonS3", "src\Persistence\MassTransit.AmazonS3\MassTransit.AmazonS3.csproj", "{86905425-64C4-4EB0-8884-F2BD27782310}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.AmazonS3", "src\Persistence\MassTransit.AmazonS3\MassTransit.AmazonS3.csproj", "{86905425-64C4-4EB0-8884-F2BD27782310}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MassTransit.AmazonS3.Tests", "tests\MassTransit.AmazonS3.Tests\MassTransit.AmazonS3.Tests.csproj", "{6E090598-2FED-41B9-9D4C-E27732985C61}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.AmazonS3.Tests", "tests\MassTransit.AmazonS3.Tests\MassTransit.AmazonS3.Tests.csproj", "{6E090598-2FED-41B9-9D4C-E27732985C61}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MassTransit.Protobuf", "src\MassTransit.Protobuf\MassTransit.Protobuf.csproj", "{A8A192A6-283B-4808-B08B-DF7769B5950F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -852,6 +854,18 @@ Global
{6E090598-2FED-41B9-9D4C-E27732985C61}.ReleaseUnsigned|Any CPU.Build.0 = Debug|Any CPU
{6E090598-2FED-41B9-9D4C-E27732985C61}.ReleaseUnsigned|x86.ActiveCfg = Debug|Any CPU
{6E090598-2FED-41B9-9D4C-E27732985C61}.ReleaseUnsigned|x86.Build.0 = Debug|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Debug|x86.ActiveCfg = Debug|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Debug|x86.Build.0 = Debug|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Release|Any CPU.Build.0 = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Release|x86.ActiveCfg = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.Release|x86.Build.0 = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.ReleaseUnsigned|Any CPU.ActiveCfg = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.ReleaseUnsigned|Any CPU.Build.0 = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.ReleaseUnsigned|x86.ActiveCfg = Release|Any CPU
{A8A192A6-283B-4808-B08B-DF7769B5950F}.ReleaseUnsigned|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -905,13 +919,14 @@ Global
{AF56509B-0B95-4ACE-9CFC-F9A79756C357} = {0006D6BB-1382-4B32-AD32-CA037F5CD4F6}
{082488F6-6322-462A-85D7-9E893A67B8CD} = {0006D6BB-1382-4B32-AD32-CA037F5CD4F6}
{7632EDAF-29A1-4E69-952F-C75D3BF34B3B} = {0006D6BB-1382-4B32-AD32-CA037F5CD4F6}
{388085C8-1BC8-48F8-8EA2-3698FCB385E5} = {4F40E08B-7C24-4D2A-8476-B7F93D0A2910}
{667E52D5-E1D9-49EE-B364-3CB7E43EE160} = {BF384860-70ED-47F0-B276-13D2DA9ECD87}
{2B6ACCF2-0CAF-4152-901F-0048390971E4} = {BF384860-70ED-47F0-B276-13D2DA9ECD87}
{667E52D5-E1D9-49EE-B364-3CB7E43EE160} = {BF384860-70ED-47F0-B276-13D2DA9ECD87}
{388085C8-1BC8-48F8-8EA2-3698FCB385E5} = {4F40E08B-7C24-4D2A-8476-B7F93D0A2910}
{186D6491-ECCD-49EB-8E99-AFD7AD6037D2} = {56F516D7-BC3C-49E1-A639-83C5F14953F8}
{694E06CF-2842-4E71-8CD2-81FA7C1B3D13} = {56F516D7-BC3C-49E1-A639-83C5F14953F8}
{86905425-64C4-4EB0-8884-F2BD27782310} = {56F516D7-BC3C-49E1-A639-83C5F14953F8}
{6E090598-2FED-41B9-9D4C-E27732985C61} = {56F516D7-BC3C-49E1-A639-83C5F14953F8}
{A8A192A6-283B-4808-B08B-DF7769B5950F} = {4F40E08B-7C24-4D2A-8476-B7F93D0A2910}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {43D3A7D5-0945-435E-8D03-1E631E5CDBA8}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace MassTransit.Configuration
{
using MassTransit.Serialization;

public static class ProtobufConfigurationExtensions
{
/// <summary>
/// Registers the Protobuf serializer with the bus, using the default Protobuf message contract.
/// </summary>
public static void UseProtobufSerializer(this IBusFactoryConfigurator configurator)
{
var factory = new ProtobufSerializerFactory<object>();

configurator.AddSerializer(factory);
}

/// <summary>
/// Register the Protobuf deserializer for a specific message type on the receive endpoint.
/// </summary>
public static void UseProtobufDeserializer<TProtoMessage>(this IReceiveEndpointConfigurator configurator, bool isDefault = true)
where TProtoMessage : class
{
var factory = new ProtobufSerializerFactory<TProtoMessage>();

configurator.AddDeserializer(factory, isDefault);
}
}
}
32 changes: 32 additions & 0 deletions src/MassTransit.Protobuf/MassTransit.Protobuf.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="../../signing.props" />

<PropertyGroup>
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
<RootNamespace>MassTransit</RootNamespace>
</PropertyGroup>

<PropertyGroup Condition=" '$(IsWindows)' == 'true' ">
<TargetFrameworks>$(TargetFrameworks);net462</TargetFrameworks>
</PropertyGroup>

<PropertyGroup>
<PackageId>MassTransit.Protobuf</PackageId>
<Title>MassTransit.Protobuf</Title>
<PackageTags>MassTransit;Protobuf</PackageTags>
<Description>MassTransit Protobuf support; $(Description)</Description>
<Version>1.0.0-alpha.38</Version>
<Copyright>Copyright 2023 - Reuben Sonnenberg</Copyright>
<IncludeSymbols>True</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="protobuf-net" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\MassTransit.Abstractions\MassTransit.Abstractions.csproj" />
<ProjectReference Include="..\MassTransit\MassTransit.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=configuration/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
24 changes: 24 additions & 0 deletions src/MassTransit.Protobuf/NullableAttributes.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#if !NET6_0_OR_GREATER && !NETSTANDARD2_1
namespace System.Diagnostics.CodeAnalysis
{
using System;


[AttributeUsage(AttributeTargets.Parameter)]
sealed class NotNullWhenAttribute :
Attribute
{
/// <summary>Initializes the attribute with the specified return value condition.</summary>
/// <param name="returnValue">
/// The return value condition. If the method returns this value, the associated parameter will not be null.
/// </param>
public NotNullWhenAttribute(bool returnValue)
{
ReturnValue = returnValue;
}

/// <summary>Gets the return value condition.</summary>
public bool ReturnValue { get; }
}
}
#endif
49 changes: 49 additions & 0 deletions src/MassTransit.Protobuf/Serialization/ProtoMessageEnvelope.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#nullable enable
namespace MassTransit.Serialization
{
using System;
using System.Collections.Generic;
using System.Linq;
using MassTransit;
using Metadata;
using ProtoBuf;

[Serializable]
public class ProtoMessageEnvelope<TProtoMessage> : MessageEnvelope
where TProtoMessage : class
{
public string? MessageId { get; set; }
public string? RequestId { get; set; }
public string? CorrelationId { get; set; }
public string? ConversationId { get; set; }
public string? InitiatorId { get; set; }
public string? SourceAddress { get; set; }
public string? DestinationAddress { get; set; }
public string? ResponseAddress { get; set; }
public string? FaultAddress { get; set; }
public string[]? MessageType { get; set; }
public object? Message { get; set; }
public DateTime? ExpirationTime { get; set; }
public DateTime? SentTime { get; set; }
public HostInfo? Host { get; set; }
public Dictionary<string, object?>? Headers { get; }

public ProtoMessageEnvelope(ProtobufMessageEnvelope<TProtoMessage> envelope)
{
MessageId = envelope.MessageId;
RequestId = envelope.RequestId;
CorrelationId = envelope.CorrelationId;
ConversationId = envelope.ConversationId;
InitiatorId = envelope.InitiatorId;
SourceAddress = envelope.SourceAddress;
DestinationAddress = envelope.DestinationAddress;
ResponseAddress = envelope.ResponseAddress;
FaultAddress = envelope.FaultAddress;
MessageType = envelope.MessageType;
Message = envelope.Message;
ExpirationTime = envelope.ExpirationTime;
SentTime = envelope.SentTime;
Headers = envelope.Headers;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#nullable enable
namespace MassTransit.Serialization
{
using System.IO;
using System.Net.Mime;
using ProtoBuf.Meta;

public class ProtobufBodyMessageSerializer : IMessageSerializer
{
private readonly ContentType _contentType;
private readonly ProtobufMessageEnvelope<object> _envelope;
private readonly RuntimeTypeModel _typeModel;

public ProtobufBodyMessageSerializer(MessageEnvelope envelope, ContentType contentType, RuntimeTypeModel typeModel)
{
_envelope = new ProtobufMessageEnvelope<object>(envelope);
_contentType = contentType;
_typeModel = typeModel;
}

public ContentType ContentType => _contentType;

public MessageBody GetMessageBody<T>(SendContext<T> context)
where T : class
{
_envelope.Update(context);

return new ProtobufMessageBody<T>(context, _typeModel, _envelope as ProtobufMessageEnvelope<T>);
}

public void Overlay(object message)
{
using (var stream = new MemoryStream())
{
_typeModel.Serialize(stream, message);
stream.Position = 0;
var overlayMessage = _typeModel.Deserialize(_envelope.Message?.GetType(), stream);
_envelope.Message = overlayMessage;
}
}
}
}
34 changes: 34 additions & 0 deletions src/MassTransit.Protobuf/Serialization/ProtobufHostInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using ProtoBuf;

namespace MassTransit.Serialization
{
#nullable enable
[ProtoContract]
[ProtoInclude(100, typeof(HostInfo))]
public class ProtobufHostInfo : HostInfo
{
[ProtoMember(1)]
public string? MachineName { set; get; }

[ProtoMember(2)]
public string? ProcessName { set; get; }

[ProtoMember(3)]
public int ProcessId { set; get; }

[ProtoMember(4)]
public string? Assembly { set; get; }

[ProtoMember(5)]
public string? AssemblyVersion { set; get; }

[ProtoMember(6)]
public string? FrameworkVersion { set; get; }

[ProtoMember(7)]
public string? MassTransitVersion { set; get; }

[ProtoMember(8)]
public string? OperatingSystemVersion { set; get; }
}
}
Loading

0 comments on commit 11e22d5

Please sign in to comment.