This commit is contained in:
Luong Hoang 2015-01-21 19:48:14 -05:00
Родитель d558b4dd66
Коммит 7fe6a9c777
14 изменённых файлов: 334 добавлений и 36 удалений

1
.gitignore поставляемый
Просмотреть файл

@ -6,6 +6,7 @@
**/dll
**/ipch
**/packages
**/bin
# VS files
*.opensdf

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

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30723.0
VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DecisionSample", "DecisionSample\DecisionSample.csproj", "{140FCD6F-077F-432D-A9E4-0D63B5DACD93}"
EndProject
@ -9,12 +9,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "explore_clr", "explore\clr\
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "explore_static", "explore\static\explore_static.vcxproj", "{ACE47E98-488C-4CDF-B9F1-36337B2855AD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DecisionServiceTest", "DecisionServiceTest\DecisionServiceTest.csproj", "{8C5A34B2-FD5F-4D3C-888C-674DE232967E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
Test|x64 = Test|x64
Test|x86 = Test|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Debug|x64.ActiveCfg = Debug|x64
@ -25,6 +29,10 @@ Global
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Release|x64.Build.0 = Release|x64
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Release|x86.ActiveCfg = Release|x86
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Release|x86.Build.0 = Release|x86
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Test|x64.ActiveCfg = Test|x64
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Test|x64.Build.0 = Test|x64
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Test|x86.ActiveCfg = Test|x86
{140FCD6F-077F-432D-A9E4-0D63B5DACD93}.Test|x86.Build.0 = Test|x86
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Debug|x64.ActiveCfg = Debug|x64
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Debug|x64.Build.0 = Debug|x64
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Debug|x86.ActiveCfg = Debug|Win32
@ -33,6 +41,10 @@ Global
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Release|x64.Build.0 = Release|x64
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Release|x86.ActiveCfg = Release|Win32
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Release|x86.Build.0 = Release|Win32
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Test|x64.ActiveCfg = Debug|x64
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Test|x64.Build.0 = Debug|x64
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Test|x86.ActiveCfg = Debug|Win32
{8400DA16-1F46-4A31-A126-BBE16F62BFD7}.Test|x86.Build.0 = Debug|Win32
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Debug|x64.ActiveCfg = Debug|x64
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Debug|x64.Build.0 = Debug|x64
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Debug|x86.ActiveCfg = Debug|Win32
@ -41,6 +53,22 @@ Global
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Release|x64.Build.0 = Release|x64
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Release|x86.ActiveCfg = Release|Win32
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Release|x86.Build.0 = Release|Win32
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Test|x64.ActiveCfg = Debug|x64
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Test|x64.Build.0 = Debug|x64
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Test|x86.ActiveCfg = Debug|Win32
{ACE47E98-488C-4CDF-B9F1-36337B2855AD}.Test|x86.Build.0 = Debug|Win32
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Debug|x64.ActiveCfg = Debug|x64
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Debug|x64.Build.0 = Debug|x64
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Debug|x86.ActiveCfg = Debug|x86
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Debug|x86.Build.0 = Debug|x86
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Release|x64.ActiveCfg = Release|x64
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Release|x64.Build.0 = Release|x64
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Release|x86.ActiveCfg = Release|x86
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Release|x86.Build.0 = Release|x86
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Test|x64.ActiveCfg = Debug|x64
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Test|x64.Build.0 = Debug|x64
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Test|x86.ActiveCfg = Debug|x86
{8C5A34B2-FD5F-4D3C-888C-674DE232967E}.Test|x86.Build.0 = Debug|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

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

@ -8,7 +8,7 @@ namespace DecisionSample
/// <remarks>
/// A batch is created whenever a criterion is met.
/// </remarks>
class BatchingConfiguration
public class BatchingConfiguration
{
/// <summary>
/// Period of time where events are grouped in one batch.

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

@ -15,7 +15,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
@ -52,6 +52,26 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Test|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Test\</OutputPath>
<DefineConstants>TRACE;DEBUG;TEST</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Test|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Test\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Data.Edm, Version=5.6.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>

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

@ -6,7 +6,7 @@ namespace DecisionSample
/// <summary>
/// Encapsulates logic for recorder with async server communications & policy update.
/// </summary>
class DecisionService<TContext> : IDisposable
public class DecisionService<TContext> : IDisposable
{
public DecisionService(DecisionServiceConfiguration<TContext> config)
{

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

@ -6,7 +6,7 @@ namespace DecisionSample
/// <summary>
/// Configuration object for the client decision service which contains settings for batching, retry storage, etc...
/// </summary>
class DecisionServiceConfiguration<TContext>
public class DecisionServiceConfiguration<TContext>
{
public DecisionServiceConfiguration()
{

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

@ -30,7 +30,7 @@ namespace DecisionSample
this.batch.Window(batchConfig.Duration)
.Select(w => w.Buffer(batchConfig.EventCount, batchConfig.BufferSize, ev => ev.Measure()))
.SelectMany(buffer => buffer)
.Subscribe(events => this.UploadBatch(events));
.Subscribe(events => this.BatchProcess(events));
}
public void Record(TContext context, uint action, float probability, string uniqueKey)
@ -62,7 +62,35 @@ namespace DecisionSample
// TODO: at the time of server communication, if the client is out of memory (or meets some predefined upper bound):
// 1. It can block the execution flow.
// 2. Or drop events.
private void UploadBatch(IList<IEvent> events)
private void BatchProcess(IList<IEvent> events)
{
using (var jsonMemStream = new MemoryStream())
using (var jsonWriter = new JsonTextWriter(new StreamWriter(jsonMemStream)))
{
JsonSerializer ser = new JsonSerializer();
ser.Serialize(jsonWriter, new EventBatch
{
Events = events,
ExperimentalUnitDurationInSeconds = this.experimentalUnitDurationInSeconds
});
jsonWriter.Flush();
jsonMemStream.Position = 0;
#if TEST
this.BatchLog("decision_service_test_output", jsonMemStream);
#else
this.BatchUpload(jsonMemStream);
#endif
}
}
private void BatchLog(string batchFile, MemoryStream jsonMemStream)
{
File.WriteAllText(batchFile, Encoding.UTF8.GetString(jsonMemStream.ToArray()));
}
private void BatchUpload(MemoryStream jsonMemStream)
{
using (var client = new HttpClient())
{
@ -70,31 +98,17 @@ namespace DecisionSample
client.Timeout = TimeSpan.FromSeconds(this.ConnectionTimeOutInSeconds);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(this.AuthenticationScheme, this.authorizationToken);
using (var jsonMemStream = new MemoryStream())
using (var jsonWriter = new JsonTextWriter(new StreamWriter(jsonMemStream)))
Task<HttpResponseMessage> taskPost = client.PostAsync(this.ServicePostAddress, new StreamContent(jsonMemStream));
taskPost.Wait();
HttpResponseMessage response = taskPost.Result;
if (!response.IsSuccessStatusCode)
{
JsonSerializer ser = new JsonSerializer();
ser.Serialize(jsonWriter, new EventBatch
{
Events = events,
ExperimentalUnitDurationInSeconds = this.experimentalUnitDurationInSeconds
});
jsonWriter.Flush();
jsonMemStream.Position = 0;
Task<string> taskReadResponse = response.Content.ReadAsStringAsync();
taskReadResponse.Wait();
string responseMessage = taskReadResponse.Result;
Task<HttpResponseMessage> taskPost = client.PostAsync(this.ServicePostAddress, new StreamContent(jsonMemStream));
taskPost.Wait();
HttpResponseMessage response = taskPost.Result;
if (!response.IsSuccessStatusCode)
{
Task<string> taskReadResponse = response.Content.ReadAsStringAsync();
taskReadResponse.Wait();
string responseMessage = taskReadResponse.Result;
// TODO: throw exception with custom message?
}
// TODO: throw exception with custom message?
}
}
}

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

@ -5,11 +5,11 @@ namespace DecisionSample
{
/* Temp classes to support interface */
interface IExploreAlgorithm<TContext>
public interface IExploreAlgorithm<TContext>
{
IExplorer<TContext> Get();
}
class EpsilonGreedyExplorer<TContext> : IExploreAlgorithm<TContext>
public class EpsilonGreedyExplorer<TContext> : IExploreAlgorithm<TContext>
{
public EpsilonGreedyExplorer(IPolicy<TContext> policy, float epsilon, uint numActions)
{
@ -28,7 +28,7 @@ namespace DecisionSample
}
}
class TauFirstExplorer<TContext> : IExploreAlgorithm<TContext>
public class TauFirstExplorer<TContext> : IExploreAlgorithm<TContext>
{
public TauFirstExplorer(IPolicy<TContext> policy, uint tau, uint numActions)
{
@ -47,7 +47,7 @@ namespace DecisionSample
}
}
class BootstrapExplorer<TContext> : IExploreAlgorithm<TContext>
public class BootstrapExplorer<TContext> : IExploreAlgorithm<TContext>
{
public BootstrapExplorer(IPolicy<TContext>[] policies, uint numActions)
{
@ -64,7 +64,7 @@ namespace DecisionSample
}
}
class SoftmaxExplorer<TContext> : IExploreAlgorithm<TContext>
public class SoftmaxExplorer<TContext> : IExploreAlgorithm<TContext>
{
public SoftmaxExplorer(IScorer<TContext> scorer, float lambda, uint numActions)
{
@ -83,7 +83,7 @@ namespace DecisionSample
}
}
class GenericExplorer<TContext> : IExploreAlgorithm<TContext>
public class GenericExplorer<TContext> : IExploreAlgorithm<TContext>
{
public GenericExplorer(IScorer<TContext> scorer, uint numActions)
{

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

@ -0,0 +1,44 @@
using DecisionSample;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
using System;
namespace DecisionServiceTest
{
[TestClass]
public class Batching
{
[TestMethod]
public void TestBatchingByCount()
{
var serviceConfig = new DecisionServiceConfiguration<TestContext>()
{
AppId = "mwt",
Explorer = new EpsilonGreedyExplorer<TestContext>(new TestPolicy(), epsilon: 0.2f, numActions: 10),
BatchConfig = new BatchingConfiguration()
{
Duration = TimeSpan.FromSeconds(30),
EventCount = 10,
BufferSize = 10 * 1024 * 1024
}
};
var service = new DecisionService<TestContext>(serviceConfig);
string uniqueKey = "eventid";
for (int i = 0; i < 4; i++)
{
uint action = service.ChooseAction(uniqueKey, new TestContext());
// Report outcome as a JSON
service.ReportOutcome("my json outcome", uniqueKey);
// Report (simple) reward as a simple float
service.ReportReward(0.5f, uniqueKey);
}
string json = System.IO.File.ReadAllText("decision_service_test_output");
var batch = JsonConvert.DeserializeObject<EventBatch>(json);
}
}
}

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

@ -0,0 +1,19 @@
using MultiWorldTesting;
using System;
using System.Collections.Generic;
namespace DecisionServiceTest
{
class TestContext { }
class TestOutcome { }
class TestPolicy : IPolicy<TestContext>
{
public uint ChooseAction(TestContext context)
{
// Always returns the same action regardless of context
return 5;
}
}
}

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

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{8C5A34B2-FD5F-4D3C-888C-674DE232967E}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DecisionServiceTest</RootNamespace>
<AssemblyName>DecisionServiceTest</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;TEST</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
</ItemGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
</ItemGroup>
</Otherwise>
</Choose>
<ItemGroup>
<Compile Include="Batching.cs" />
<Compile Include="Common.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DecisionSample\DecisionSample.csproj">
<Project>{140fcd6f-077f-432d-a9e4-0d63b5dacd93}</Project>
<Name>DecisionSample</Name>
</ProjectReference>
<ProjectReference Include="..\explore\clr\explore_clr.vcxproj">
<Project>{8400da16-1f46-4a31-a126-bbe16f62bfd7}</Project>
<Name>explore_clr</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
</ItemGroup>
</When>
</Choose>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<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,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("DecisionServiceTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DecisionServiceTest")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("624df17a-6d9d-495c-a1b6-27ab88befab4")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

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

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

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

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
</packages>