Skip to content
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

Added explicit .NET 6 TFMs. #28911

Closed
wants to merge 15 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion eng/Directory.Build.Common.props
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@
<SupportsNetStandard20 Condition="'$(SupportsNetStandard20)' == ''">false</SupportsNetStandard20>

<RequiredTargetFrameworks>net452;netstandard1.4;net461;netstandard2.0</RequiredTargetFrameworks>
<RequiredTargetFrameworks Condition="'$(SupportsNetStandard20)' == 'true'">netstandard2.0</RequiredTargetFrameworks>
<RequiredTargetFrameworks Condition="'$(SupportsNetStandard20)' == 'true'">netstandard2.0;net6.0</RequiredTargetFrameworks>
</PropertyGroup>

<PropertyGroup Condition="'$(IsTestProject)' == 'true' or '$(IsTestSupportProject)' == 'true' or '$(IsSamplesProject)' == 'true' or '$(IsPerfProject)' == 'true' or '$(IsStressProject)' == 'true'">
Expand Down
4 changes: 2 additions & 2 deletions eng/Directory.Build.Common.targets
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<MissingTargetFrameworks Include="@(RequiredTargetFrameworks)" Exclude="@(ConfiguredTargetFrameworks)" />
</ItemGroup>

<Error Condition="'@(RequiredTargetFrameworks)' == ''" Text="List of required target frameworks is empty something must have messed up property RequiredTargetFrameworks[$(RequiredTargetFrameworks)]." />
<Error Condition="'@(MissingTargetFrameworks)' != ''" Text="Missing required target frameworks '@(MissingTargetFrameworks)'. Please ensure you add those frameworks." />
<Error Condition="'@(RequiredTargetFrameworks)' == ''" Text="List of required target frameworks is empty so something must have messed up the property RequiredTargetFrameworks[$(RequiredTargetFrameworks)]." />
<Error Condition="'@(MissingTargetFrameworks)' != ''" Text="Missing required target frameworks '@(MissingTargetFrameworks)'. Please ensure you add those frameworks to project '$(MSBuildProjectName)'." />
</Target>

<Target Name="ValidateRunApiCompat" BeforeTargets="Build" Condition="'$(ValidateRunApiCompat)' == 'true'">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be better to use Condition="!$([MSBuild]::IsTargetFrameworkCompatible($(TargetFramework), 'net6.0'))" for all such conditions, compatibility check is future-proof

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is true, alright I will do it when I can.

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
5 changes: 4 additions & 1 deletion sdk/anomalydetector/Azure.AI.AnomalyDetector/src/Azure.AI.AnomalyDetector.csproj
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
<PackageReference Include="System.ClientModel" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Core" />
<!-- <PackageReference Include="Azure.Core" /> -->
<ProjectReference Include="..\..\..\core\Azure.Core\src\Azure.Core.csproj" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
<PackageReference Include="System.Text.Json" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
<ItemGroup>
<PackageReference Include="Azure.Core" />
<PackageReference Include="System.Memory.Data" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ public AttestationTokenSigningKey(X509Certificate2 certificate)
{
throw new ArgumentException($"Certificate provided {certificate.ToString()} does not have a private key.");
}
#if NET6_0_OR_GREATER
Signer = (AsymmetricAlgorithm)certificate.GetRSAPrivateKey() ?? certificate.GetECDsaPrivateKey();
#else
Signer = certificate.PrivateKey;
#endif
Certificate = certificate;
VerifySignerMatchesCertificate(Signer, Certificate);
}
Expand All @@ -62,17 +66,17 @@ public AttestationTokenSigningKey(X509Certificate2 certificate)

private static void VerifySignerMatchesCertificate(AsymmetricAlgorithm signer, X509Certificate2 certificate)
{
if (!signer.KeyExchangeAlgorithm.StartsWith(certificate.PublicKey.Key.KeyExchangeAlgorithm, System.StringComparison.Ordinal))
if (!signer.KeyExchangeAlgorithm.StartsWith(((AsymmetricAlgorithm)certificate.GetRSAPublicKey() ?? certificate.GetECDsaPublicKey()).KeyExchangeAlgorithm, System.StringComparison.Ordinal))
{
throw new ArgumentException($"Signer key algorithm {signer.SignatureAlgorithm} does not match certificate key algorithm {certificate.PublicKey.Key.SignatureAlgorithm}");
throw new ArgumentException($"Signer key algorithm {signer.SignatureAlgorithm} does not match certificate key algorithm {((AsymmetricAlgorithm)certificate.GetRSAPublicKey() ?? certificate.GetECDsaPublicKey()).SignatureAlgorithm}");
}

// Try to match the public key in the certificate and the signer. If the platform
// supports the ToXmlString API, then use that since it the simplest solution and is relatively fast.
try
{
string signerKey = signer.ToXmlString(false);
string certificateKey = certificate.PublicKey.Key.ToXmlString(false);
string certificateKey = ((AsymmetricAlgorithm)certificate.GetRSAPublicKey() ?? certificate.GetECDsaPublicKey()).ToXmlString(false);
if (signerKey != certificateKey)
{
throw new ArgumentException($"Signer key {signerKey} does not match certificate key {certificateKey}");
Expand All @@ -98,7 +102,7 @@ private static void VerifySignerMatchesCertificate(AsymmetricAlgorithm signer, X
throw new ArgumentException("Signing Key must be either RSA or ECDsa. Unknown signing key found");
}

AsymmetricAlgorithm verifyingAlgorithm = certificate.PublicKey.Key;
AsymmetricAlgorithm verifyingAlgorithm = (AsymmetricAlgorithm)certificate.GetRSAPublicKey() ?? certificate.GetECDsaPublicKey();
if (verifyingAlgorithm is RSA verifyingRsa)
{
if (!verifyingRsa.VerifyData(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,17 @@
Improve usability of GetOutputStoragePath.
</PackageReleaseNotes>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
<TargetFrameworks>net461;netstandard2.0;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" VersionOverride="12.12.0" />
<PackageReference Include="Microsoft.Azure.Batch" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Encodings.Web" VersionOverride="4.7.2" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,22 @@
</PackageReleaseNotes>
</PropertyGroup>
<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
<TargetFrameworks>net461;netstandard2.0;net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Text.Encodings.Web" VersionOverride="4.7.2" />
<PackageReference Include="WindowsAzure.Storage" />
<PackageReference Include="Microsoft.Azure.Batch" />
<PackageReference Include="Azure.Storage.Blobs" VersionOverride="12.12.0" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Encodings.Web" VersionOverride="4.7.2" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System.Web" />
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
<PackageReleaseNotes>For detailed release notes, see: https://aka.ms/batch-net-dataplane-changelog </PackageReleaseNotes>
</PropertyGroup>

<ItemGroup>
<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Encodings.Web" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
<ItemGroup>
<PackageReference Include="Azure.Core" />
<PackageReference Include="Azure.Communication.Common" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Core" />
<!--<PackageReference Include="Azure.Core" />-->
<ProjectReference Include="..\..\..\core\Azure.Core\src\Azure.Core.csproj" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
3 changes: 2 additions & 1 deletion sdk/core/Azure.Core.Amqp/src/Azure.Core.Amqp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
<NoWarn>$(NoWarn);AZC0001</NoWarn>
</PropertyGroup>

<ItemGroup>
<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Memory" />
<PackageReference Include="System.Memory.Data" />
<PackageReference Include="Microsoft.Azure.Amqp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="Microsoft.CSharp" />
</ItemGroup>

Expand Down
7 changes: 6 additions & 1 deletion sdk/core/Azure.Core/src/Azure.Core.csproj
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>This is the implementation of the Azure Client Pipeline</Description>
Expand All @@ -20,14 +20,19 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Threading.Tasks.Extensions" />
<PackageReference Include="System.Memory.Data" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
<PackageReference Include="System.ClientModel" />
<PackageReference Include="System.Numerics.Vectors" />
<PackageReference Include="System.Diagnostics.DiagnosticSource" />
<PackageReference Include="System.Threading.Tasks.Extensions" />
<PackageReference Include="System.Text.Json" />
<PackageReference Include="System.Text.Encodings.Web" />
<PackageReference Include="System.Memory.Data" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
Expand Down
4 changes: 4 additions & 0 deletions sdk/core/Azure.Core/src/Shared/RetriableStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,11 @@ public override async Task<int> ReadAsync(byte[] buffer, int offset, int count,
{
try
{
#if NET6_0_OR_GREATER
var result = await _currentStream.ReadAsync(buffer.AsMemory(offset, count), cancellationToken).ConfigureAwait(false);
#else
var result = await _currentStream.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false);
#endif
_position += result;
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@

<ItemGroup>
<PackageReference Include="Microsoft.Spatial" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Encodings.Web" />
<PackageReference Include="System.Text.Json" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,14 @@

<ItemGroup>
<PackageReference Include="Azure.Core" />
<PackageReference Include="System.Text.Json" />
<PackageReference Include="System.Memory.Data" />
</ItemGroup>

<!-- These packages are included as part net6.0; the external references are not needed. -->
<ItemGroup Condition="'$(TargetFramework)' != 'net6.0'">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For maintainability should this be inverted so that adding future frameworks doesn't need the conditions to be touched?

<PackageReference Include="System.Text.Json" />
</ItemGroup>

<!-- Shared source from Azure.Core -->
<ItemGroup>
<Compile Include="$(AzureCoreSharedSources)ArrayBufferWriter.cs" LinkBase="Shared" />
Expand Down
Loading
Loading