Skip to content

Commit 41b4a13

Browse files
Added NLogProviderOptions.IncludeActivtyIdsWithBeginScope, added .NET 5 build, move tests to .NET Core LTS (#456)
* Added NLogProviderOptions.IncludeActivtyIdsWithBeginScope * Fix build warnings about targetframeworks being out of support * Fix build warning about obsolete PackageLicenseUrl * Added net50 to build script * Fix build-warning about PackageIconUrl being obsolete * Fix build warnings about targetframeworks being out of support * Update build scripts to not use targetframeworks being out of support * Added NLogProviderOptions.IncludeActivtyIdsWithBeginScope (RequestPath validation) * test for .NET 5 * tests with opencover * fix duplicate in csproj * fix duplicate in csproj v2 Co-authored-by: Julian Verdurmen <304NotModified@users.noreply.github.com>
1 parent bd98259 commit 41b4a13

10 files changed

Lines changed: 196 additions & 25 deletions

File tree

appveyor.yml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ artifacts:
2222
test_script:
2323
- nuget.exe install OpenCover -ExcludeVersion -DependencyVersion Ignore
2424
- OpenCover\tools\OpenCover.Console.exe -register:user -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp1.1 -c debug NLog.Extensions.Logging.Tests" -filter:"+[NLog.Extensions.Logging]* +[NLog.Extensions.Hosting]* -[NLog.Extensions.Logging.Tests]* -[NLog.Extensions.Hosting.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
25-
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp2.0 -c debug NLog.Extensions.Logging.Tests" -filter:"+[NLog.Extensions.Logging]* -[NLog.Extensions.Logging.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
26-
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.0 -c debug NLog.Extensions.Logging.Tests" -filter:"+[NLog.Extensions.Logging]* -[NLog.Extensions.Logging.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
27-
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp2.0 -c debug NLog.Extensions.Hosting.Tests" -filter:"+[NLog.Extensions.Logging]* +[NLog.Extensions.Hosting]* -[NLog.Extensions.Logging.Tests]* -[NLog.Extensions.Hosting.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
28-
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.0 -c debug NLog.Extensions.Hosting.Tests" -filter:"+[NLog.Extensions.Logging]* +[NLog.Extensions.Hosting]* -[NLog.Extensions.Logging.Tests]* -[NLog.Extensions.Hosting.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
25+
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp2.1 -c debug NLog.Extensions.Logging.Tests" -filter:"+[NLog.Extensions.Logging]* -[NLog.Extensions.Logging.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
26+
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.1 -c debug NLog.Extensions.Logging.Tests" -filter:"+[NLog.Extensions.Logging]* -[NLog.Extensions.Logging.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
27+
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f net5.0 -c debug NLog.Extensions.Logging.Tests" -filter:"+[NLog.Extensions.Logging]* -[NLog.Extensions.Logging.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
28+
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp2.1 -c debug NLog.Extensions.Hosting.Tests" -filter:"+[NLog.Extensions.Logging]* +[NLog.Extensions.Hosting]* -[NLog.Extensions.Logging.Tests]* -[NLog.Extensions.Hosting.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
29+
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.1 -c debug NLog.Extensions.Hosting.Tests" -filter:"+[NLog.Extensions.Logging]* +[NLog.Extensions.Hosting]* -[NLog.Extensions.Logging.Tests]* -[NLog.Extensions.Hosting.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
30+
- OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f net5.0 -c debug NLog.Extensions.Hosting.Tests" -filter:"+[NLog.Extensions.Logging]* +[NLog.Extensions.Hosting]* -[NLog.Extensions.Logging.Tests]* -[NLog.Extensions.Hosting.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"test"
31+
- pip install codecov
2932
- pip install codecov
3033
- codecov -f "coverage.xml"
3134
- ps: .\run-sonar.ps1

build.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ dotnet restore .\src\NLog.Extensions.Hosting\
1717
if (-Not $LastExitCode -eq 0)
1818
{ exit $LastExitCode }
1919

20-
msbuild /t:Pack .\src\NLog.Extensions.Logging\ /p:targetFrameworks='"net451;net461;netstandard1.3;netstandard1.5;netstandard2.0;netcoreapp3.0"' /p:VersionPrefix=$versionPrefix /p:VersionSuffix=$versionSuffix /p:FileVersion=$versionFile /p:ProductVersion=$versionProduct /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:PackageOutputPath=..\..\artifacts /verbosity:minimal
20+
msbuild /t:Pack .\src\NLog.Extensions.Logging\ /p:targetFrameworks='"net451;net461;netstandard1.3;netstandard1.5;netstandard2.0;netcoreapp3.0;net5.0"' /p:VersionPrefix=$versionPrefix /p:VersionSuffix=$versionSuffix /p:FileVersion=$versionFile /p:ProductVersion=$versionProduct /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:PackageOutputPath=..\..\artifacts /verbosity:minimal
2121
if (-Not $LastExitCode -eq 0)
2222
{ exit $LastExitCode }
2323

24-
msbuild /t:Pack .\src\NLog.Extensions.Hosting\ /p:targetFrameworks='"netstandard2.0;netcoreapp3.0"' /p:VersionPrefix=$versionPrefix /p:VersionSuffix=$versionSuffix /p:FileVersion=$versionFile /p:ProductVersion=$versionProduct /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:PackageOutputPath=..\..\artifacts /verbosity:minimal
24+
msbuild /t:Pack .\src\NLog.Extensions.Hosting\ /p:targetFrameworks='"netstandard2.0;netcoreapp3.0;net5.0"' /p:VersionPrefix=$versionPrefix /p:VersionSuffix=$versionSuffix /p:FileVersion=$versionFile /p:ProductVersion=$versionProduct /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:PackageOutputPath=..\..\artifacts /verbosity:minimal
2525
if (-Not $LastExitCode -eq 0)
2626
{ exit $LastExitCode }
2727

src/NLog.Extensions.Hosting/NLog.Extensions.Hosting.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0;netcoreapp3.0;net5.0</TargetFrameworks>
55
<DebugType Condition=" '$(Configuration)' == 'Debug' ">Full</DebugType>
66
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
@@ -41,6 +41,10 @@ Full changelog: https://github.com/NLog/NLog.Extensions.Logging/blob/master/CHAN
4141
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0" />
4242
</ItemGroup>
4343

44+
<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0' ">
45+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
46+
</ItemGroup>
47+
4448
<ItemGroup>
4549
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
4650
<ProjectReference Include="..\NLog.Extensions.Logging\NLog.Extensions.Logging.csproj" />

src/NLog.Extensions.Logging/Extensions/ConfigureExtensions.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,19 @@ public static ILoggingBuilder AddNLog(this ILoggingBuilder factory, IConfigurati
8484
return factory;
8585
}
8686

87+
/// <summary>
88+
/// Enable NLog as logging provider for Microsoft Extension Logging
89+
/// </summary>
90+
/// <param name="factory"></param>
91+
/// <param name="configuration">Configuration</param>
92+
/// <param name="options">NLog options</param>
93+
/// <returns>ILoggingBuilder for chaining</returns>
94+
public static ILoggingBuilder AddNLog(this ILoggingBuilder factory, IConfiguration configuration, NLogProviderOptions options)
95+
{
96+
AddNLogLoggerProvider(factory.Services, configuration, options, CreateNLogLoggerProvider);
97+
return factory;
98+
}
99+
87100
/// <summary>
88101
/// Enable NLog as logging provider for Microsoft Extension Logging
89102
/// </summary>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#if NET5_0
2+
3+
using System.Diagnostics;
4+
5+
namespace NLog.Extensions.Logging
6+
{
7+
/// <summary>
8+
/// Helpers for getting the right values from Activity no matter the format (w3c or hierarchical)
9+
/// </summary>
10+
internal static class ActivityExtensions
11+
{
12+
public static string GetSpanId(this Activity activity)
13+
{
14+
return activity.IdFormat switch
15+
{
16+
ActivityIdFormat.Hierarchical => activity.Id,
17+
ActivityIdFormat.W3C => activity.SpanId.ToHexString(),
18+
_ => null,
19+
} ?? string.Empty;
20+
}
21+
22+
public static string GetTraceId(this Activity activity)
23+
{
24+
return activity.IdFormat switch
25+
{
26+
ActivityIdFormat.Hierarchical => activity.RootId,
27+
ActivityIdFormat.W3C => activity.TraceId.ToHexString(),
28+
_ => null,
29+
} ?? string.Empty;
30+
}
31+
32+
public static string GetParentId(this Activity activity)
33+
{
34+
return activity.IdFormat switch
35+
{
36+
ActivityIdFormat.Hierarchical => activity.ParentId,
37+
ActivityIdFormat.W3C => activity.ParentSpanId.ToHexString(),
38+
_ => null,
39+
} ?? string.Empty;
40+
}
41+
}
42+
}
43+
44+
#endif

src/NLog.Extensions.Logging/Logging/NLogBeginScopeParser.cs

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public IDisposable ParseBeginScope<T>(T state)
3131
{
3232
if (state is IReadOnlyList<KeyValuePair<string, object>> scopePropertyList)
3333
{
34-
return ScopeProperties.CaptureScopeProperties(scopePropertyList);
34+
return ScopeProperties.CaptureScopeProperties(scopePropertyList, _options.IncludeActivtyIdsWithBeginScope);
3535
}
3636

3737
if (!(state is string))
@@ -90,18 +90,92 @@ private static IDisposable CreateScopeProperties(object scopeObject, IReadOnlyLi
9090
return NestedDiagnosticsLogicalContext.Push(scopeObject);
9191
}
9292

93-
public static IDisposable CaptureScopeProperties(IReadOnlyList<KeyValuePair<string, object>> scopePropertyList)
93+
public static IDisposable CaptureScopeProperties(IReadOnlyList<KeyValuePair<string, object>> scopePropertyList, bool includeActivtyIdsWithBeginScope)
9494
{
9595
object scopeObject = scopePropertyList;
9696

97-
if (scopePropertyList.Count > 0 && NLogLogger.OriginalFormatPropertyName.Equals(scopePropertyList[scopePropertyList.Count - 1].Key))
97+
if (scopePropertyList.Count > 0)
9898
{
99-
scopePropertyList = ExcludeOriginalFormatProperty(scopePropertyList);
99+
if (NLogLogger.OriginalFormatPropertyName.Equals(scopePropertyList[scopePropertyList.Count - 1].Key))
100+
{
101+
scopePropertyList = ExcludeOriginalFormatProperty(scopePropertyList);
102+
}
103+
else if (includeActivtyIdsWithBeginScope && "RequestId".Equals(scopePropertyList[0].Key))
104+
{
105+
scopePropertyList = IncludeActivityIdsProperties(scopePropertyList);
106+
}
100107
}
101108

102109
return CreateScopeProperties(scopeObject, scopePropertyList);
103110
}
104111

112+
#if !NET5_0
113+
private static IReadOnlyList<KeyValuePair<string, object>> IncludeActivityIdsProperties(IReadOnlyList<KeyValuePair<string, object>> scopePropertyList)
114+
{
115+
return scopePropertyList;
116+
}
117+
#else
118+
private static IReadOnlyList<KeyValuePair<string, object>> IncludeActivityIdsProperties(IReadOnlyList<KeyValuePair<string, object>> scopePropertyList)
119+
{
120+
if (scopePropertyList.Count > 1 && "RequestPath".Equals(scopePropertyList[1].Key))
121+
{
122+
var activty = System.Diagnostics.Activity.Current;
123+
if (activty != null)
124+
return new ScopePropertiesWithActivityIds(scopePropertyList, activty);
125+
}
126+
127+
return scopePropertyList;
128+
}
129+
130+
private class ScopePropertiesWithActivityIds : IReadOnlyList<KeyValuePair<string, object>>
131+
{
132+
private readonly IReadOnlyList<KeyValuePair<string, object>> _originalPropertyList;
133+
private readonly System.Diagnostics.Activity _currentActivity;
134+
135+
public ScopePropertiesWithActivityIds(IReadOnlyList<KeyValuePair<string, object>> originalPropertyList, System.Diagnostics.Activity currentActivity)
136+
{
137+
_originalPropertyList = originalPropertyList;
138+
_currentActivity = currentActivity;
139+
}
140+
141+
public KeyValuePair<string, object> this[int index]
142+
{
143+
get
144+
{
145+
int offset = index - _originalPropertyList.Count;
146+
if (offset < 0)
147+
{
148+
return _originalPropertyList[index];
149+
}
150+
else
151+
{
152+
switch (offset)
153+
{
154+
case 0: return new KeyValuePair<string, object>(nameof(_currentActivity.SpanId), _currentActivity.GetSpanId());
155+
case 1: return new KeyValuePair<string, object>(nameof(_currentActivity.TraceId), _currentActivity.GetTraceId());
156+
case 2: return new KeyValuePair<string, object>(nameof(_currentActivity.ParentId), _currentActivity.GetParentId());
157+
}
158+
}
159+
160+
throw new ArgumentOutOfRangeException(nameof(index));
161+
}
162+
}
163+
164+
public int Count => _originalPropertyList.Count + 3;
165+
166+
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
167+
{
168+
for (int i = 0; i < Count; ++i)
169+
yield return this[i];
170+
}
171+
172+
IEnumerator IEnumerable.GetEnumerator()
173+
{
174+
return ((IEnumerable)_originalPropertyList).GetEnumerator();
175+
}
176+
}
177+
#endif
178+
105179
private static IReadOnlyList<KeyValuePair<string, object>> ExcludeOriginalFormatProperty(IReadOnlyList<KeyValuePair<string, object>> scopePropertyList)
106180
{
107181
if (scopePropertyList.Count == 2 && !NLogLogger.OriginalFormatPropertyName.Equals(scopePropertyList[0].Key))

src/NLog.Extensions.Logging/Logging/NLogProviderOptions.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ public class NLogProviderOptions
4343
/// </summary>
4444
public bool ShutdownOnDispose { get; set; }
4545

46+
#if NET5_0
47+
/// <summary>
48+
/// Automatically include <see cref="System.Diagnostics.Activity.SpanId"/>, <see cref="System.Diagnostics.Activity.TraceId"/> and <see cref="System.Diagnostics.Activity.ParentId"/>
49+
/// </summary>
50+
/// <remarks>For Net5.0 where these properties are no longer included by default for performance reasons</remarks>
51+
#else
52+
/// <summary>
53+
/// Automatically include Activity.SpanId, Activity.TraceId and Activity.ParentId.
54+
/// </summary>
55+
/// <remarks>For Net5.0 where these properties are no longer included by default for performance reasons</remarks>
56+
#endif
57+
public bool IncludeActivtyIdsWithBeginScope { get; set; }
58+
4659
/// <summary>Initializes a new instance NLogProviderOptions with default values.</summary>
4760
public NLogProviderOptions()
4861
{

src/NLog.Extensions.Logging/NLog.Extensions.Logging.csproj

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
44

5-
<TargetFrameworks>net451;net461;netstandard1.3;netstandard1.5;netstandard2.0;netcoreapp3.0</TargetFrameworks>
5+
<TargetFrameworks>net451;net461;netstandard1.3;netstandard1.5;netstandard2.0;netcoreapp3.0;net5.0</TargetFrameworks>
66
<DebugType Condition=" '$(Configuration)' == 'Debug' ">Full</DebugType>
77
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
88
<GenerateDocumentationFile>true</GenerateDocumentationFile>
@@ -38,6 +38,11 @@ Full changelog: https://github.com/NLog/NLog.Extensions.Logging/blob/master/CHAN
3838
<AssemblyOriginatorKeyFile>..\NLog.snk</AssemblyOriginatorKeyFile>
3939
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
4040
</PropertyGroup>
41+
42+
<Target Name="DownloadMissingContent" BeforeTargets="GenerateNuspec">
43+
<DownloadFile SourceUrl="https://nlog-project.org/N.png" DestinationFolder="$(MSBuildThisFileDirectory)" />
44+
</Target>
45+
4146
<PropertyGroup Condition=" '$(TargetFramework)' == 'net461' ">
4247
<Title>NLog.Extensions.Logging for .NET Framework 4.6.1</Title>
4348
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
@@ -48,23 +53,27 @@ Full changelog: https://github.com/NLog/NLog.Extensions.Logging/blob/master/CHAN
4853
<DefineConstants>$(DefineConstants);NETCORE1_0</DefineConstants>
4954
</PropertyGroup>
5055
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
51-
<Title>NLog.Extensions.Logging for NetStandard 1.3</Title>
56+
<Title>NLog.Extensions.Logging for .NET Standard 1.3</Title>
5257
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
5358
<DefineConstants>$(DefineConstants);NETCORE1_0;NETSTANDARD</DefineConstants>
5459
</PropertyGroup>
5560
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.5' ">
56-
<Title>NLog.Extensions.Logging for NetStandard 1.5</Title>
61+
<Title>NLog.Extensions.Logging for .NET Standard 1.5</Title>
5762
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
5863
<DefineConstants>$(DefineConstants);NETCORE1_0;NETSTANDARD</DefineConstants>
5964
</PropertyGroup>
6065
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
61-
<Title>NLog.Extensions.Logging for NetStandard 2.0</Title>
66+
<Title>NLog.Extensions.Logging for .NET Standard 2.0</Title>
6267
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
6368
</PropertyGroup>
6469
<PropertyGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">
6570
<Title>NLog.Extensions.Logging for .NET Core 3</Title>
6671
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
6772
</PropertyGroup>
73+
<PropertyGroup Condition=" '$(TargetFramework)' == 'net5.0' ">
74+
<Title>NLog.Extensions.Logging for .NET 5.0</Title>
75+
<DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
76+
</PropertyGroup>
6877
<ItemGroup>
6978
<PackageReference Include="NLog" Version="4.7.6" />
7079
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
@@ -91,17 +100,20 @@ Full changelog: https://github.com/NLog/NLog.Extensions.Logging/blob/master/CHAN
91100
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
92101
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0" />
93102
</ItemGroup>
94-
95103
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">
96104
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0.0" />
97105
</ItemGroup>
106+
<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0' ">
107+
<PackageReference Include="Microsoft.Extensions.Logging" Version="5.0.0" />
108+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0" />
109+
</ItemGroup>
110+
98111
<ItemGroup>
99112
<None Include="N.png" Pack="true" PackagePath=""/>
100113
</ItemGroup>
101114
<Target Name="DownloadMissingContent" BeforeTargets="GenerateNuspec">
102115
<DownloadFile SourceUrl="https://nlog-project.org/N.png" DestinationFolder="$(MSBuildThisFileDirectory)" />
103116
</Target>
104-
105117
<PropertyGroup>
106118
<AssemblyTitle>$(Title)</AssemblyTitle>
107119
<LangVersion>latest</LangVersion>

0 commit comments

Comments
 (0)