Added sample models and view models

This commit is contained in:
Wiesław Šoltés 2016-09-01 00:12:25 +02:00
Родитель 129775f20f
Коммит 0f8a44142f
15 изменённых файлов: 524 добавлений и 0 удалений

Просмотреть файл

@ -23,6 +23,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveHistory.UnitTests",
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{4A600469-8200-4BDD-AA90-6B34B2D1CD2A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveHistorySample.Models", "samples\ReactiveHistorySample.Models\ReactiveHistorySample.Models.csproj", "{9DDD104E-C3D1-43E1-84C1-D332E89927FB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveHistorySample.ViewModels", "samples\ReactiveHistorySample.ViewModels\ReactiveHistorySample.ViewModels.csproj", "{A3C460F7-DF9E-4D6B-8CF3-A1E668C7F2F1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -37,6 +41,10 @@ Global
{71BA2D95-53E6-42D4-ADAA-CF34C77494F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{71BA2D95-53E6-42D4-ADAA-CF34C77494F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{71BA2D95-53E6-42D4-ADAA-CF34C77494F5}.Release|Any CPU.Build.0 = Release|Any CPU
{9DDD104E-C3D1-43E1-84C1-D332E89927FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9DDD104E-C3D1-43E1-84C1-D332E89927FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A3C460F7-DF9E-4D6B-8CF3-A1E668C7F2F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A3C460F7-DF9E-4D6B-8CF3-A1E668C7F2F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -44,5 +52,7 @@ Global
GlobalSection(NestedProjects) = preSolution
{9832484C-4BBE-43E9-B40E-9F57AF68A185} = {15FC57FA-8C2F-43AF-82D4-F53A1AA3A7EF}
{71BA2D95-53E6-42D4-ADAA-CF34C77494F5} = {E982B451-CC08-4731-B035-E0E1B38B81A5}
{9DDD104E-C3D1-43E1-84C1-D332E89927FB} = {4A600469-8200-4BDD-AA90-6B34B2D1CD2A}
{A3C460F7-DF9E-4D6B-8CF3-A1E668C7F2F1} = {4A600469-8200-4BDD-AA90-6B34B2D1CD2A}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,23 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace ReactiveHistorySample.Models
{
public abstract class BaseObject : ObservableObject
{
private object _owner;
private string _name;
public object Owner
{
get { return _owner; }
set { Update(ref _owner, value); }
}
public string Name
{
get { return _name; }
set { Update(ref _name, value); }
}
}
}

Просмотреть файл

@ -0,0 +1,9 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace ReactiveHistorySample.Models
{
public abstract class BaseShape : BaseObject
{
}
}

Просмотреть файл

@ -0,0 +1,24 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Collections.ObjectModel;
namespace ReactiveHistorySample.Models
{
public class Layer : BaseObject
{
private ObservableCollection<LineShape> _shapes;
public ObservableCollection<LineShape> Shapes
{
get { return _shapes; }
set { Update(ref _shapes, value); }
}
public Layer(object owner = null, string name = null)
{
this.Owner = owner;
this.Name = name;
this.Shapes = new ObservableCollection<LineShape>();
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace ReactiveHistorySample.Models
{
public class LineShape : BaseShape
{
private PointShape _start;
private PointShape _end;
public PointShape Start
{
get { return _start; }
set { Update(ref _start, value); }
}
public PointShape End
{
get { return _end; }
set { Update(ref _end, value); }
}
public LineShape(object owner = null, string name = null)
{
this.Owner = owner;
this.Name = name;
}
public LineShape(PointShape start, PointShape end, object owner = null, string name = null)
: this(owner, name)
{
this.Start = start;
this.End = end;
}
}
}

Просмотреть файл

@ -0,0 +1,28 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace ReactiveHistorySample.Models
{
public abstract class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void Notify([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public bool Update<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (!Equals(field, value))
{
field = value;
Notify(propertyName);
return true;
}
return false;
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace ReactiveHistorySample.Models
{
public class PointShape : BaseShape
{
private double _x;
private double _y;
public double X
{
get { return _x; }
set { Update(ref _x, value); }
}
public double Y
{
get { return _y; }
set { Update(ref _y, value); }
}
public PointShape(object owner = null, string name = null)
{
this.Owner = owner;
this.Name = name;
}
public PointShape(double x, double y, object owner = null, string name = null)
: this(owner, name)
{
this.X = x;
this.Y = y;
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Resources;
using System.Reflection;
[assembly: AssemblyTitle("ReactiveHistorySample.Models")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ReactiveHistorySample.Models")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("en")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,56 @@
<?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>
<MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9DDD104E-C3D1-43E1-84C1-D332E89927FB}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ReactiveHistorySample.Models</RootNamespace>
<AssemblyName>ReactiveHistorySample.Models</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<TargetFrameworkProfile>Profile7</TargetFrameworkProfile>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
</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>
</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>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included -->
</ItemGroup>
<ItemGroup>
<Compile Include="BaseObject.cs" />
<Compile Include="BaseShape.cs" />
<Compile Include="Layer.cs" />
<Compile Include="LineShape.cs" />
<Compile Include="ObservableObject.cs" />
<Compile Include="PointShape.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.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>

Просмотреть файл

@ -0,0 +1,52 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Reactive.Disposables;
using Reactive.Bindings;
using Reactive.Bindings.Extensions;
using ReactiveHistory;
using ReactiveHistorySample.Models;
namespace ReactiveHistorySample.ViewModels
{
public class LayerViewModel : IDisposable
{
private CompositeDisposable Disposable { get; set; }
public ReactiveProperty<string> Name { get; set; }
public ReadOnlyReactiveCollection<LineShapeViewModel> Shapes { get; set; }
public ReactiveCommand UndoCommand { get; set; }
public ReactiveCommand RedoCommand { get; set; }
public ReactiveCommand ClearCommand { get; set; }
public LayerViewModel(Layer layer, IHistory history)
{
Disposable = new CompositeDisposable();
this.Name = layer.ToReactivePropertyAsSynchronized(l => l.Name)
.SetValidateNotifyError(name => string.IsNullOrWhiteSpace(name) ? "Name can not be null or whitespace." : null)
.AddTo(this.Disposable);
this.Shapes = layer.Shapes
.ToReadOnlyReactiveCollection(x => new LineShapeViewModel(x, history))
.AddTo(this.Disposable);
this.Name.ObserveWithHistory(name => layer.Name = name, layer.Name, history).AddTo(this.Disposable);
UndoCommand = new ReactiveCommand(history.CanUndo, false);
UndoCommand.Subscribe(_ => history.Undo());
RedoCommand = new ReactiveCommand(history.CanRedo, false);
RedoCommand.Subscribe(_ => history.Redo());
ClearCommand = new ReactiveCommand(history.CanClear, false);
ClearCommand.Subscribe(_ => history.Clear());
}
public void Dispose()
{
this.Disposable.Dispose();
}
}
}

Просмотреть файл

@ -0,0 +1,57 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Reactive.Disposables;
using Reactive.Bindings;
using Reactive.Bindings.Extensions;
using ReactiveHistory;
using ReactiveHistorySample.Models;
namespace ReactiveHistorySample.ViewModels
{
public class LineShapeViewModel : IDisposable
{
private CompositeDisposable Disposable { get; set; }
public ReactiveProperty<string> Name { get; set; }
public ReactiveProperty<PointShapeViewModel> Start { get; set; }
public ReactiveProperty<PointShapeViewModel> End { get; set; }
public ReactiveCommand DeleteCommand { get; set; }
public LineShapeViewModel(LineShape line, IHistory history)
{
Disposable = new CompositeDisposable();
this.Name = line.ToReactivePropertyAsSynchronized(l => l.Name)
.SetValidateNotifyError(name => string.IsNullOrWhiteSpace(name) ? "Name can not be null or whitespace." : null)
.AddTo(this.Disposable);
this.Start = new ReactiveProperty<PointShapeViewModel>(new PointShapeViewModel(line.Start, history))
.SetValidateNotifyError(start => start == null ? "Point can not be null." : null)
.AddTo(this.Disposable);
this.End = new ReactiveProperty<PointShapeViewModel>(new PointShapeViewModel(line.End, history))
.SetValidateNotifyError(end => end == null ? "Point can not be null." : null)
.AddTo(this.Disposable);
this.Name.ObserveWithHistory(name => line.Name = name, line.Name, history).AddTo(this.Disposable);
this.DeleteCommand = new ReactiveCommand();
this.DeleteCommand.Subscribe((x) => Delete(line, history)).AddTo(this.Disposable);
}
private void Delete(LineShape line, IHistory history)
{
if (line.Owner != null && line.Owner is Layer)
{
(line.Owner as Layer).Shapes.DeleteWithHistory(line, history);
}
}
public void Dispose()
{
this.Disposable.Dispose();
}
}
}

Просмотреть файл

@ -0,0 +1,46 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Reactive.Disposables;
using Reactive.Bindings;
using Reactive.Bindings.Extensions;
using ReactiveHistory;
using ReactiveHistorySample.Models;
namespace ReactiveHistorySample.ViewModels
{
public class PointShapeViewModel : IDisposable
{
private CompositeDisposable Disposable { get; set; }
public ReactiveProperty<string> Name { get; set; }
public ReactiveProperty<double> X { get; set; }
public ReactiveProperty<double> Y { get; set; }
public PointShapeViewModel(PointShape point, IHistory history)
{
Disposable = new CompositeDisposable();
this.Name = point.ToReactivePropertyAsSynchronized(p => p.Name)
.SetValidateNotifyError(name => string.IsNullOrWhiteSpace(name) ? "Name can not be null or whitespace." : null)
.AddTo(this.Disposable);
this.X = point.ToReactivePropertyAsSynchronized(p => p.X)
.SetValidateNotifyError(x => double.IsNaN(x) || double.IsInfinity(x) ? "X can not be NaN or Infinity." : null)
.AddTo(this.Disposable);
this.Y = point.ToReactivePropertyAsSynchronized(p => p.Y)
.SetValidateNotifyError(y => double.IsNaN(y) || double.IsInfinity(y) ? "Y can not be NaN or Infinity." : null)
.AddTo(this.Disposable);
this.Name.ObserveWithHistory(name => point.Name = name, point.Name, history).AddTo(this.Disposable);
this.X.ObserveWithHistory(x => point.X = x, point.X, history).AddTo(this.Disposable);
this.Y.ObserveWithHistory(y => point.Y = y, point.Y, history).AddTo(this.Disposable);
}
public void Dispose()
{
this.Disposable.Dispose();
}
}
}

Просмотреть файл

@ -0,0 +1,17 @@
// Copyright (c) Wiesław Šoltés. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("ReactiveHistorySample.ViewModels")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ReactiveHistorySample.ViewModels")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("a3c460f7-df9e-4d6b-8cf3-a1e668c7f2f1")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,104 @@
<?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>{A3C460F7-DF9E-4D6B-8CF3-A1E668C7F2F1}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ReactiveHistorySample.ViewModels</RootNamespace>
<AssemblyName>ReactiveHistorySample.ViewModels</AssemblyName>
<TargetFrameworkVersion>v4.5</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>
</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>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="ReactiveProperty, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\ReactiveProperty.3.0.1\lib\net45\ReactiveProperty.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ReactiveProperty.NET45, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\ReactiveProperty.3.0.1\lib\net45\ReactiveProperty.NET45.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.Reactive.Core, Version=3.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Reactive.Interfaces, Version=3.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Reactive.Linq, Version=3.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Reactive.PlatformServices, Version=3.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Reactive.Windows.Threading, Version=3.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="LayerViewModel.cs" />
<Compile Include="LineShapeViewModel.cs" />
<Compile Include="PointShapeViewModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\ReactiveHistory\ReactiveHistory.csproj">
<Project>{9832484c-4bbe-43e9-b40e-9f57af68a185}</Project>
<Name>ReactiveHistory</Name>
</ProjectReference>
<ProjectReference Include="..\ReactiveHistorySample.Models\ReactiveHistorySample.Models.csproj">
<Project>{9ddd104e-c3d1-43e1-84c1-d332e89927fb}</Project>
<Name>ReactiveHistorySample.Models</Name>
</ProjectReference>
</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>

Просмотреть файл

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ReactiveProperty" version="3.0.1" targetFramework="net45" />
<package id="System.Reactive" version="3.0.0" targetFramework="net45" />
<package id="System.Reactive.Core" version="3.0.0" targetFramework="net45" />
<package id="System.Reactive.Interfaces" version="3.0.0" targetFramework="net45" />
<package id="System.Reactive.Linq" version="3.0.0" targetFramework="net45" />
<package id="System.Reactive.PlatformServices" version="3.0.0" targetFramework="net45" />
<package id="System.Reactive.Windows.Threading" version="3.0.0" targetFramework="net45" />
</packages>