Commit 3cc75fb1 authored by Andy James's avatar Andy James

Add support for .NET Standard

parent 11c540d7
Pipeline #19 passed with stage
using System;
using System.IO;
using System.Collections.Concurrent;
using System.Linq;
using System.Xml;
......@@ -7,6 +8,9 @@ using System.Xml.Serialization;
using NChronicle.Core.Model;
using NChronicle.File.Exceptions;
using NChronicle.File.Interfaces;
#if !NETFX
using System.Reflection;
#endif
namespace NChronicle.File.Configuration {
......@@ -37,7 +41,7 @@ namespace NChronicle.File.Configuration {
this.IgnoredTags = new ConcurrentDictionary<string, byte>();
this.TimeZone = TimeZoneInfo.Local;
this.OutputPattern = "{%yyyy/MM/dd HH:mm:ss.fff} [{TH}] {MSG?{MSG} {EXC?\n}}{EXC?{EXC}\n}{TAGS?[{TAGS}]}";
this.OutputPath = System.IO.Path.Combine(Environment.CurrentDirectory, "chronicle.log");
this.OutputPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "chronicle.log");
}
/// <summary>
......@@ -169,17 +173,16 @@ namespace NChronicle.File.Configuration {
/// </summary>
/// <param name="path">The file path to append records to.</param>
public void WithOutputPath (string path) {
if (path == null) {
throw new ArgumentNullException(nameof(path));
}
if (path.Any(System.IO.Path.GetInvalidPathChars().Contains)
|| System.IO.Path.GetFileName(path).Any(System.IO.Path.GetInvalidFileNameChars().Contains))
if (path.Any(Path.GetInvalidPathChars().Contains)
|| Path.GetFileName(path).Any(Path.GetInvalidFileNameChars().Contains))
throw new InvalidFilePathException("The path or file name in the given path contains one or more invalid characters.");
if (!System.IO.Path.IsPathRooted(path))
path = System.IO.Path.Combine(Environment.CurrentDirectory, path);
if (!Path.IsPathRooted(path))
path = Path.Combine(Directory.GetCurrentDirectory(), path);
if (!System.IO.File.Exists(path))
System.IO.File.Create(path).Close();
System.IO.File.Create(path).Dispose();
this.OutputPath = path;
}
......@@ -309,11 +312,13 @@ namespace NChronicle.File.Configuration {
/// <seealso cref="NotListening"/>
public void ListeningToAllLevels() {
this.Levels.Clear();
foreach (var levelName in typeof (ChronicleLevel).GetEnumNames()) {
var enumNames = Enum.GetNames(typeof(ChronicleLevel));
foreach (var levelName in enumNames) {
ChronicleLevel level;
Enum.TryParse(levelName, out level);
this.Levels[level] = 0;
}
this._levelsAreDefault = false;
}
......@@ -491,7 +496,7 @@ namespace NChronicle.File.Configuration {
try {
this.WithTimeZone(TimeZoneInfo.FindSystemTimeZoneById(timeZone));
}
catch (TimeZoneNotFoundException) {
catch (Exception) {
throw new XmlException($"Unexpected library configuration for {nameof(FileChronicleLibrary)}, value '{timeZone}' for {nameof(this.TimeZone)} is not a valid TimeZone ID.");
}
break;
......@@ -502,9 +507,13 @@ namespace NChronicle.File.Configuration {
var type = Type.GetType(typeStr, false, true);
if (type == null)
throw new TypeLoadException($"Unexpected library configuration for {nameof(FileChronicleLibrary)}, type {typeStr} could not be found.");
if (type.GetInterface(nameof(IRetentionPolicy)) == null)
#if NETFX
if (!typeof(IRetentionPolicy).IsAssignableFrom(type))
#else
if (!typeof(IRetentionPolicy).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
#endif
throw new TypeLoadException($"Unexpected library configuration for {nameof(FileChronicleLibrary)}, type {type.Name} does not implement {nameof(IRetentionPolicy)}.");
IRetentionPolicy retentionPolicy = null;
IRetentionPolicy retentionPolicy = null;
try {
retentionPolicy = Activator.CreateInstance(type) as IRetentionPolicy;
} catch (MissingMethodException e) {
......
......@@ -10,19 +10,36 @@ using NChronicle.Core.Interfaces;
using NChronicle.Core.Model;
using NChronicle.File.Configuration;
using NChronicle.File.Delegates;
using System.Collections.Concurrent;
namespace NChronicle.File {
/// <summary>
/// A <see cref="IChronicleLibrary"/> writing <see cref="ChronicleRecord"/>s to a file.
/// </summary>
public class FileChronicleLibrary : IChronicleLibrary, IDisposable {
private readonly FileChronicleLibraryConfiguration _configuration;
private volatile FileStream _fileStream;
private string _fileStreamLockKey => string.Intern ($"{nameof (FileChronicleLibrary)}.{nameof (this._fileStream)}.{this._configuration.OutputPath}");
private readonly Dictionary<string, MethodHandler> _methods;
namespace NChronicle.File {
/// <summary>
/// A <see cref="IChronicleLibrary"/> writing <see cref="ChronicleRecord"/>s to a file.
/// </summary>
public class FileChronicleLibrary : IChronicleLibrary, IDisposable {
#if !NETFX
private static ConcurrentDictionary<string, object> _fsLockObjects = new ConcurrentDictionary<string, object>();
#endif
private readonly FileChronicleLibraryConfiguration _configuration;
private volatile FileStream _fileStream;
#if NETFX
private string _fileStreamLockKey => string.Intern ($"{nameof (FileChronicleLibrary)}.{nameof (this._fileStream)}.{this._configuration.OutputPath}");
#else
private object _fileStreamLockKey {
get {
lock (FileChronicleLibrary._fsLockObjects) {
return FileChronicleLibrary._fsLockObjects.ContainsKey(this._configuration.OutputPath)
? FileChronicleLibrary._fsLockObjects[this._configuration.OutputPath]
: (FileChronicleLibrary._fsLockObjects[this._configuration.OutputPath] = new object());
}
}
}
#endif
private readonly Dictionary<string, MethodHandler> _methods;
private readonly Dictionary<string, KeyHandler> _keys;
/// <summary>
......@@ -64,7 +81,7 @@ namespace NChronicle.File {
private string FormulateOutput (ChronicleRecord record, string pattern) {
var output = pattern;
var currentTime = TimeZoneInfo.ConvertTimeFromUtc (DateTime.UtcNow, this._configuration.TimeZone);
var currentTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Utc, this._configuration.TimeZone);
foreach (var token in this.FindTokens (pattern)) {
var tokenBody = token.Substring (1, token.Length - 2);
var tokenIsDate = tokenBody.StartsWith ("%");
......@@ -160,7 +177,6 @@ namespace NChronicle.File {
}
private void SendToFile (string output) {
//if (this._disposed) return;
if (this._fileStream == null) {
lock (this._fileStreamLockKey) {
if (this._fileStream == null) {
......@@ -170,9 +186,9 @@ namespace NChronicle.File {
}
var bytes = Encoding.UTF8.GetBytes ($"{output}\r\n");
lock (this._fileStreamLockKey) {
if (this._configuration.RetentionPolicy != null) {
if (this._configuration.RetentionPolicy != null) {
if (this._configuration.RetentionPolicy.CheckPolicy (this._configuration.OutputPath, bytes)) {
this._fileStream.Close ();
this._fileStream.Dispose ();
this._configuration.RetentionPolicy.InvokePolicy (this._configuration.OutputPath);
this._fileStream = new FileStream (this._configuration.OutputPath, FileMode.Append, FileAccess.Write, FileShare.Read);
}
......@@ -196,7 +212,7 @@ namespace NChronicle.File {
private delegate string MethodHandler (ChronicleRecord record, params string [] parameters);
private delegate string KeyHandler (ChronicleRecord record);
#region Xml Serialization
#region Xml Serialization
/// <summary>
/// Required for XML serialization, this method offers no functionality.
/// </summary>
......@@ -216,7 +232,7 @@ namespace NChronicle.File {
/// <param name="writer"><see cref="XmlWriter" /> stream to the configuration file.</param>
/// <seealso cref="Core.NChronicle.SaveConfigurationTo(string)"/>
public void WriteXml (XmlWriter writer) => this._configuration.WriteXml (writer);
#endregion
#endregion
/// <summary>
/// Conclude and close this <see cref="FileChronicleLibrary"/>.
......@@ -225,7 +241,7 @@ namespace NChronicle.File {
if (this._fileStream != null) {
lock (this._fileStreamLockKey) {
this._fileStream.Flush ();
this._fileStream.Close ();
this._fileStream.Dispose ();
}
}
GC.SuppressFinalize (this);
......
......@@ -3,11 +3,11 @@
<metadata>
<id>NChronicle.File</id>
<title>NChronicle.File</title>
<version>1.0.1</version>
<version>1.1.0</version>
<authors>Andy James</authors>
<owners>Andy James</owners>
<licenseUrl>https://git.ikimi.co/andrewj/NChronicle/raw/master/LICENSE</licenseUrl>
<projectUrl>https://git.ikimi.co/andrewj/NChronicle</projectUrl>
<licenseUrl>https://git.ikimi.co/NChronicle/NChronicle.File/raw/master/LICENSE</licenseUrl>
<projectUrl>https://git.ikimi.co/NChronicle/NChronicle.File</projectUrl>
<iconUrl>https://git.ikimi.co/uploads/project/avatar/2/NChronicle_simple_square.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<summary>
......@@ -22,7 +22,13 @@ Further Libraries planned for the NChronicle logging framework include NChronicl
</description>
<dependencies>
<group targetFramework="net40">
<dependency id="NChronicle.Core" version="1.0.3" />
<dependency id="NChronicle.Core" version="1.1.0" />
</group>
<group targetFramework="netstandard1.4">
<dependency id="NChronicle.Core" version="1.1.0" />
<dependency id="System.IO.FileSystem" version="4.3.0" />
<dependency id="System.Reflection" version="4.3.0" />
<dependency id="System.Threading.Thread" version="4.3.0" />
</group>
</dependencies>
<frameworkAssemblies>
......@@ -32,12 +38,13 @@ Further Libraries planned for the NChronicle logging framework include NChronicl
</frameworkAssemblies>
<language>en-us</language>
<releaseNotes>
Added support for configuration from XML (including runtime configuration changes).
Added support for .NET Standard
</releaseNotes>
<copyright>Copyright 2017</copyright>
<tags>NChronicle Events Audit Logging Log Trail Recording History Tracking Output File Archive Retention</tags>
</metadata>
<files>
<file src="bin/Release/NChronicle.File.dll" target="lib\net40" />
<file src="bin/Release/netfx4.0/NChronicle.File.dll" target="lib\net40" />
<file src="bin/Release/netstandard1.4/NChronicle.File.dll" target="lib\netstandard1.4" />
</files>
</package>
......@@ -28,7 +28,7 @@
<SourceCodeBasePath>.\</SourceCodeBasePath>
<MissingTags>Summary, Parameter, Returns, AutoDocumentCtors, TypeParameter, AutoDocumentDispose</MissingTags>
<DocumentationSources>
<DocumentationSource sourceFile="NChronicle.File.csproj" />
<DocumentationSource sourceFile="NChronicle.File_NetFx.csproj" />
</DocumentationSources>
<HelpFileVersion>1.0.1</HelpFileVersion>
<MaximumGroupParts>2</MaximumGroupParts>
......
......@@ -3,12 +3,26 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26430.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NChronicle.File", "NChronicle.File.csproj", "{5CCFB68D-D230-48AA-9DDC-BCE65BA8EC87}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NChronicle.File_NetFx", "NChronicle.File_NetFx.csproj", "{5CCFB68D-D230-48AA-9DDC-BCE65BA8EC87}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Wiki", "Wiki", "{1338668E-E646-4575-B3D8-7E6F5980AE63}"
EndProject
Project("{7CF6DF6D-3B04-46F8-A40B-537D21BCA0B4}") = "NChronicle.File", "NChronicle.File.shfbproj", "{7D4D4587-76D5-4F06-980A-E9505DFCA7B6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{34FC1FD6-3C79-401D-A6FD-DE4DF95FA268}"
ProjectSection(SolutionItems) = preProject
NChronicle.File.nuspec = NChronicle.File.nuspec
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{C655F21E-855F-4A70-BCB9-DCB8B200DD2F}"
ProjectSection(SolutionItems) = preProject
.gitlab-ci.yml = .gitlab-ci.yml
Build.ps1 = Build.ps1
BuildFormattedWiki.ps1 = BuildFormattedWiki.ps1
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NChronicle.File_NetStandard", "NChronicle.File_NetStandard.csproj", "{88B7A5A9-538C-4DB6-8F50-6BC58D09F475}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -23,11 +37,16 @@ Global
{7D4D4587-76D5-4F06-980A-E9505DFCA7B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D4D4587-76D5-4F06-980A-E9505DFCA7B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D4D4587-76D5-4F06-980A-E9505DFCA7B6}.Release|Any CPU.Build.0 = Release|Any CPU
{88B7A5A9-538C-4DB6-8F50-6BC58D09F475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{88B7A5A9-538C-4DB6-8F50-6BC58D09F475}.Debug|Any CPU.Build.0 = Debug|Any CPU
{88B7A5A9-538C-4DB6-8F50-6BC58D09F475}.Release|Any CPU.ActiveCfg = Release|Any CPU
{88B7A5A9-538C-4DB6-8F50-6BC58D09F475}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{7D4D4587-76D5-4F06-980A-E9505DFCA7B6} = {1338668E-E646-4575-B3D8-7E6F5980AE63}
{7D4D4587-76D5-4F06-980A-E9505DFCA7B6} = {34FC1FD6-3C79-401D-A6FD-DE4DF95FA268}
{C655F21E-855F-4A70-BCB9-DCB8B200DD2F} = {34FC1FD6-3C79-401D-A6FD-DE4DF95FA268}
EndGlobalSection
EndGlobal
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{5CCFB68D-D230-48AA-9DDC-BCE65BA8EC87}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NChronicle.File</RootNamespace>
<AssemblyName>NChronicle.File</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\NChronicle.File.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\NChronicle.File.XML</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<Reference Include="NChronicle.Core, Version=1.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\NChronicle.Core.1.0.3\lib\net40\NChronicle.Core.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\FileChronicleLibraryConfiguration.cs" />
<Compile Include="Configuration\RetentionPolicyConfiguration.cs" />
<Compile Include="RetentionPolicy.cs" />
<Compile Include="Delegates\RetentionPolicyConfigurationDelegate.cs" />
<Compile Include="Interfaces\IRetentionPolicy.cs" />
<Compile Include="Delegates\FileChronicleLibraryConfigurationDelegate.cs" />
<Compile Include="Exceptions\InvalidFilePathException.cs" />
<Compile Include="Extensions\ConfigurationExtensions.cs" />
<Compile Include="FileChronicleLibrary.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{5CCFB68D-D230-48AA-9DDC-BCE65BA8EC87}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NChronicle.File</RootNamespace>
<AssemblyName>NChronicle.File</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<ResolveNuGetPackages>false</ResolveNuGetPackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\netfx4.0\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\NChronicle.File.XML</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\netfx4.0\</OutputPath>
<DefineConstants>TRACE;NETFX</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\NChronicle.File.XML</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<Reference Include="NChronicle.Core, Version=1.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\NChronicle.Core.1.0.3\lib\net40\NChronicle.Core.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\FileChronicleLibraryConfiguration.cs" />
<Compile Include="Configuration\RetentionPolicyConfiguration.cs" />
<Compile Include="RetentionPolicy.cs" />
<Compile Include="Delegates\RetentionPolicyConfigurationDelegate.cs" />
<Compile Include="Interfaces\IRetentionPolicy.cs" />
<Compile Include="Delegates\FileChronicleLibraryConfigurationDelegate.cs" />
<Compile Include="Exceptions\InvalidFilePathException.cs" />
<Compile Include="Extensions\ConfigurationExtensions.cs" />
<Compile Include="FileChronicleLibrary.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
\ No newline at end of file
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.4</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<AssemblyName>NChronicle.File</AssemblyName>
<RootNamespace>NChronicle.File</RootNamespace>
<Version>1.1.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<LangVersion>latest</LangVersion>
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<None Remove="**\*" />
<Compile Include="Configuration\FileChronicleLibraryConfiguration.cs" />
<Compile Include="Configuration\RetentionPolicyConfiguration.cs" />
<Compile Include="RetentionPolicy.cs" />
<Compile Include="Delegates\RetentionPolicyConfigurationDelegate.cs" />
<Compile Include="Interfaces\IRetentionPolicy.cs" />
<Compile Include="Delegates\FileChronicleLibraryConfigurationDelegate.cs" />
<Compile Include="Exceptions\InvalidFilePathException.cs" />
<Compile Include="Extensions\ConfigurationExtensions.cs" />
<Compile Include="FileChronicleLibrary.cs" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NChronicle.Core" Version="1.1.0" />
<PackageReference Include="System.IO.FileSystem" Version="4.3.0" />
<PackageReference Include="System.Reflection" Version="4.3.0" />
<PackageReference Include="System.Threading.Thread" Version="4.3.0" />
</ItemGroup>
</Project>
\ No newline at end of file
......@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment