1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Added support for built-in plugins

Added dependency injection to IPlugin construction
This commit is contained in:
SpoinkyNL 2018-03-02 20:51:39 +01:00
parent f5749ccb26
commit a51ae92fea
27 changed files with 557 additions and 1141 deletions

View File

@ -35,9 +35,6 @@
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.4.2.1\lib\net45\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="CSScriptLibrary, Version=3.28.0.0, Culture=neutral, PublicKeyToken=70fcc3d18c749033, processorArchitecture=MSIL">
<HintPath>..\packages\CS-Script.bin.3.28.0.1\lib\net46\CSScriptLibrary.dll</HintPath>
</Reference>
<Reference Include="HidSharp, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\HidSharp.1.5\lib\net35\HidSharp.dll</HintPath>
</Reference>
@ -47,15 +44,6 @@
<Reference Include="Microsoft.CodeAnalysis.CSharp, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeAnalysis.CSharp.Scripting, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.Scripting.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Scripting.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeAnalysis.Scripting, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.Scripting.Common.2.6.1\lib\netstandard1.3\Microsoft.CodeAnalysis.Scripting.dll</HintPath>
</Reference>
<Reference Include="Mono.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\CS-Script.bin.3.28.0.1\lib\net46\Mono.CSharp.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
@ -68,61 +56,47 @@
<Reference Include="Ninject.Extensions.Factory, Version=3.3.2.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.Extensions.Factory.3.3.2\lib\net45\Ninject.Extensions.Factory.dll</HintPath>
</Reference>
<Reference Include="RGB.NET.Brushes">
<Reference Include="RGB.NET.Brushes, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Brushes.0.0.1.38\lib\net45\RGB.NET.Brushes.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Core">
<Reference Include="RGB.NET.Core, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Core.0.0.1.38\lib\net45\RGB.NET.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Decorators">
<Reference Include="RGB.NET.Decorators, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Decorators.0.0.1.38\lib\net45\RGB.NET.Decorators.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Asus">
<Reference Include="RGB.NET.Devices.Asus, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Asus.0.0.1.38\lib\net45\RGB.NET.Devices.Asus.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.CoolerMaster">
<Reference Include="RGB.NET.Devices.CoolerMaster, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\lib\net45\RGB.NET.Devices.CoolerMaster.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Corsair">
<Reference Include="RGB.NET.Devices.Corsair, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Corsair.0.0.1.38\lib\net45\RGB.NET.Devices.Corsair.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.DMX">
<Reference Include="RGB.NET.Devices.DMX, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.DMX.0.0.1.38\lib\net45\RGB.NET.Devices.DMX.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Logitech">
<Reference Include="RGB.NET.Devices.Logitech, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Logitech.0.0.1.38\lib\net45\RGB.NET.Devices.Logitech.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Msi">
<Reference Include="RGB.NET.Devices.Msi, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Msi.0.0.1.38\lib\net45\RGB.NET.Devices.Msi.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Novation">
<Reference Include="RGB.NET.Devices.Novation, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Novation.0.0.1.38\lib\net45\RGB.NET.Devices.Novation.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Razer">
<Reference Include="RGB.NET.Devices.Razer, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Razer.0.0.1.38\lib\net45\RGB.NET.Devices.Razer.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Groups">
<Reference Include="RGB.NET.Groups, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Groups.0.0.1.38\lib\net45\RGB.NET.Groups.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Input">
<Reference Include="RGB.NET.Input, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Input.0.0.1.38\lib\net45\RGB.NET.Input.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Input.Corsair">
<Reference Include="RGB.NET.Input.Corsair, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Input.Corsair.0.0.1.38\lib\net45\RGB.NET.Input.Corsair.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Sanford.Multimedia.Midi, Version=6.6.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sanford.Multimedia.Midi.6.6.0\lib\net20\Sanford.Multimedia.Midi.dll</HintPath>
@ -216,9 +190,6 @@
<Compile Include="ProfileElements\Profile.cs" />
<Compile Include="Ninject\CoreModule.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Scripting.evaluator.cs" />
<Compile Include="Scripting.Extensions.cs" />
<Compile Include="Scripting.native.cs" />
<Compile Include="Services\CoreService.cs" />
<Compile Include="Services\RgbService.cs" />
<Compile Include="Services\Interfaces\IRgbService.cs" />
@ -237,26 +208,34 @@
<Project>{cd23bc5e-57f0-46ce-a007-24d031146219}</Project>
<Name>Artemis.Plugins</Name>
</ProjectReference>
<ProjectReference Include="..\Module.General\Module.General.csproj">
<Project>{58113cc5-a9ca-4ec3-ab4e-3c94b99268d8}</Project>
<Name>Module.General</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.2.6.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll" />
<Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.2.6.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets" Condition="Exists('..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets'))" />
</PropertyGroup>
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets'))" />
</Target>
<Import Project="..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets" Condition="Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets" Condition="Exists('..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets')" />
</Target>
<Import Project="..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets" Condition="Exists('..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets" Condition="Exists('..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets" Condition="Exists('..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets" Condition="Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets" Condition="Exists('..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets')" />
</Project>

View File

@ -4,7 +4,6 @@ namespace Artemis.Core
{
public static class Constants
{
public static readonly string DataFolder =
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Artemis\\";
public static readonly string DataFolder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\Artemis\\";
}
}

View File

@ -1,4 +1,5 @@
using Artemis.Core.Services.Interfaces;
using Artemis.Plugins.Interfaces;
using Ninject.Extensions.Conventions;
using Ninject.Modules;
@ -17,6 +18,15 @@ namespace Artemis.Core.Ninject
.BindAllInterfaces()
.Configure(c => c.InSingletonScope());
});
// Bind all built-in plugins
Kernel.Bind(x =>
{
x.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IPlugin>()
.BindAllBaseClasses();
});
}
}
}

View File

@ -1,295 +0,0 @@
using CSScriptLibrary;
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.Remoting.Lifetime;
using System.Threading;
using System.Threading.Tasks;
// Read in more details about all aspects of CS-Script hosting in applications
// here: http://www.csscript.net/help/Script_hosting_guideline_.html
//
// This file contains samples for the script hosting scenarios requiring asynchronous script execution as well as unloading the
// scripts being executed.
// AsyncSamples
// Samples demonstrate the use of Async and Await mechanism available in C# 5 and higher. Note that the async method extensions
// cover the complete set of CSScript.Evaluator methods.
//
// UnloadingSamples
// Samples demonstrate the use of temporary AppDoamain for loading and executing dynamic C# code (script). It is the
// only mechanism available for unloading dynamically loaded assemblies. This is a well known CLR design limitation that leads to
// memory leaks if the assembly/script loaded in the caller AppDomain. The problem affects all C# script engines (e.g. Roslyn, CodeDom)
// and it cannot be solved by the engine itself thus CS-Script provides a work around in form of the MethodExtensions for the
// CSScript.Evaluator methods that are compatible with the unloading mechanism.
//
// Nevertheless you should try to avoid using remote AppDoamain unless you have to. It is very heavy and also imposes the serialization
// constrains.
//
// All samples rely on the compiler agnostic CSScript.Evaluator API.
namespace CSScriptEvaluatorExtensions
{
public class HostApp
{
public static void Test()
{
Console.WriteLine("---------------------------------------------");
Console.WriteLine("Testing asynchronous API");
Console.WriteLine("---------------------------------------------");
new AsyncSamples().RunAll();
Thread.Sleep(2000);
Console.WriteLine("\nPress 'Enter' to run uloading samples...");
Console.ReadLine();
Console.WriteLine("---------------------------------------------");
Console.WriteLine("Testing unloading API");
Console.WriteLine("---------------------------------------------");
new UnloadingSamples().RunAll();
}
class AsyncSamples
{
public void RunAll()
{
Action<Action, string> run = (action, name) => { action(); Console.WriteLine(name); };
run(LoadDelegateAsync, "Start of " + nameof(LoadDelegateAsync));
run(LoadMethodAsync, "Start of " + nameof(LoadMethodAsync));
run(LoadCodeAsync, "Start of " + nameof(LoadCodeAsync));
run(CreateDelegateAsync, "Start of " + nameof(CreateDelegateAsync));
run(CompileCodeAsync, "Start of " + nameof(CompileCodeAsync));
run(RemoteAsynch, "Start of " + nameof(RemoteAsynch));
}
async void LoadDelegateAsync()
{
var product = await CSScript.Evaluator
.LoadDelegateAsync<Func<int, int, int>>(
@"int Product(int a, int b)
{
return a * b;
}");
Console.WriteLine(" End of {0}: {1}", nameof(LoadDelegateAsync), product(4, 2));
}
public async void LoadMethodAsync()
{
dynamic script = await CSScript.Evaluator
.LoadMethodAsync(@"public int Sum(int a, int b)
{
return a + b;
}
public int Div(int a, int b)
{
return a/b;
}");
Console.WriteLine(" End of {0}: {1}", nameof(LoadMethodAsync), script.Div(15, 3));
}
public async void LoadCodeAsync()
{
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
ICalc calc = await CSScript.Evaluator
.LoadCodeAsync<ICalc>(
@"using System;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}");
Console.WriteLine(" End of {0}: {1}", nameof(LoadCodeAsync), calc.Sum(1, 2));
}
public async void CreateDelegateAsync()
{
var product = await CSScript.Evaluator
.CreateDelegateAsync<int>(
@"int Product(int a, int b)
{
return a * b;
}");
Console.WriteLine(" End of {0}: {1}", nameof(CreateDelegateAsync), product(15, 3));
}
public async void CompileCodeAsync()
{
Assembly script = await CSScript.Evaluator
.CompileCodeAsync(@"using System;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}");
dynamic calc = script.CreateObject("*");
Console.WriteLine(" End of {0}: {1}", nameof(CompileCodeAsync), calc.Sum(15, 3));
}
public async void RemoteAsynch()
{
var sum = await Task.Run(() =>
CSScript.Evaluator
.CreateDelegateRemotely<int>(
@"int Sum(int a, int b)
{
return a+b;
}")
);
Console.WriteLine(" End of {0}: {1}", nameof(RemoteAsynch), sum(1, 2));
sum.UnloadOwnerDomain();
}
}
class UnloadingSamples
{
public void RunAll()
{
CreateDelegateRemotely();
LoadMethodRemotely();
LoadCodeRemotely();
LoadCodeRemotelyWithInterface();
}
public void CreateDelegateRemotely()
{
var sum = CSScript.Evaluator
.CreateDelegateRemotely<int>(@"int Sum(int a, int b)
{
return a+b;
}");
Console.WriteLine("{0}: {1}", nameof(CreateDelegateRemotely), sum(15, 3));
sum.UnloadOwnerDomain();
}
public void LoadCodeRemotely()
{
// Class Calc doesn't implement ICals interface. Thus the compiled object cannot be typecasted into
// the interface and Evaluator will emit duck-typed assembly instead.
// But Mono and Roslyn build file-less assemblies, meaning that they cannot be used to build
// duck-typed proxies and CodeDomEvaluator needs to be used explicitly.
// Note class Calc also inherits from MarshalByRefObject. This is required for all object that
// are passed between AppDomain: they must inherit from MarshalByRefObject or be serializable.
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
var script = CSScript.CodeDomEvaluator
.LoadCodeRemotely<ICalc>(
@"using System;
public class Calc : MarshalByRefObject
{
object t;
public int Sum(int a, int b)
{
t = new Test();
return a+b;
}
}
class Test
{
~Test()
{
Console.WriteLine(""Domain is unloaded: ~Test()"");
}
}
");
Console.WriteLine("{0}: {1}", nameof(LoadCodeRemotely), script.Sum(15, 3));
script.UnloadOwnerDomain();
}
public void LoadCodeRemotelyWithInterface()
{
// Note class Calc also inherits from MarshalByRefObject. This is required for all object that
// are passed between AppDomain: they must inherit from MarshalByRefObject or be serializable.
var script = CSScript.Evaluator
.LoadCodeRemotely<ICalc>(
@"using System;
public class Calc : MarshalByRefObject, CSScriptEvaluatorExtensions.ICalc
{
public int Sum(int a, int b)
{
return a+b;
}
}
");
Console.WriteLine("{0}: {1}", nameof(LoadCodeRemotelyWithInterface), script.Sum(15, 3));
script.UnloadOwnerDomain();
}
public void LoadMethodRemotely()
{
// LoadMethodRemotely is essentially the same as LoadCodeRemotely. It just deals not with the
// whole class definition but a single method(s) only. And the rest of the class definition is
// added automatically by CS-Script. The auto-generated class declaration also indicates
// that the class implements ICalc interface. Meaning that it will trigger compile error
// if the set of methods in the script code doesn't implement all interface members.
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
var script = CSScript.Evaluator
.LoadMethodRemotely<IFullCalc>(
@"public int Sum(int a, int b)
{
return a+b;
}
public int Sub(int a, int b)
{
return a-b;
}");
Console.WriteLine("{0}: {1}", nameof(LoadMethodRemotely), script.Sum(15, 3));
script.UnloadOwnerDomain();
}
MethodDelegate sum;
ClientSponsor sumSponsor;
public void KeepRemoteObjectAlive()
{
sum = CSScript.Evaluator
.CreateDelegateRemotely(@"int Sum(int a, int b)
{
return a+b;
}");
//Normally remote objects are disposed if they are not accessed withing a default timeout period.
//It is not even enough to keep transparent proxies or their wrappers (e.g. 'sum') referenced.
//To prevent GC collection in the remote domain use .NET ClientSponsor mechanism as below.
sumSponsor = sum.ExtendLifeFromMinutes(30);
}
}
}
public interface ICalc
{
int Sum(int a, int b);
}
public interface IFullCalc
{
int Sum(int a, int b);
int Sub(int a, int b);
}
}

View File

@ -1,345 +0,0 @@
using CSScriptLibrary;
using System;
using System.Diagnostics;
// Read in more details about all aspects of CS-Script hosting in applications
// here: http://www.csscript.net/help/Script_hosting_guideline_.html
//
// This file contains samples for the script hosting scenarios relying on CS-Script Evaluator interface (API).
// This API is a unified generic interface allowing dynamic switch of the underlying compiling services (Mono, Roslyn, CodeDom)
// without the need for changing the hosting code.
//
// Apart from Evaluator (compiler agnostic) API CS-Script offers alternative hosting model: CS-Script Native,
// which relies solely on CodeDom compiler. CS-Script Native offers some features that are not available with CS-Script Evaluator
// (e.g. script unloading).
//
// The choice of the underlying compiling engine (e.g. Mono vs CodeDom) when using CS-Script Evaluator is always dictated by the
// specifics of the hosting scenario. Thanks to in-process compiler hosting, Mono and Roslyn demonstrate much better compiling
// performance comparing to CodeDom engine. However they don't allow script debugging and caching easily supported with CodeDom.
// Mono and particularly Roslyn also leas create more memory pressure due to the higher volume of the temp assemblies loaded into
// the hosting AppDomain. Roslyn (at least CSharp.Scripting-v1.2.0.0) also has very high initial loading overhead up to 4 seconds.
//
// One of the possible approaches would be to use EvaluatorEngine.CodeDom during the active development and later on switch to Mono/Roslyn.
namespace CSScriptEvaluatorApi
{
public class HostApp
{
public static void Test()
{
// Just in case clear AlternativeCompiler so it is not set to Roslyn or anything else by
// the CS-Script installed (if any) on the host OS
CSScript.GlobalSettings.UseAlternativeCompiler = null;
var samples = new EvaluatorSamples();
Console.WriteLine("Testing compiling services");
Console.WriteLine("---------------------------------------------");
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.Mono;
Console.WriteLine(CSScript.Evaluator.GetType().Name + "...");
samples.RunAll();
Console.WriteLine("---------------------------------------------");
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.Roslyn;
Console.WriteLine(CSScript.Evaluator.GetType().Name + "...");
samples.RunAll();
Console.WriteLine("---------------------------------------------");
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom;
Console.WriteLine(CSScript.Evaluator.GetType().Name + "...");
samples.RunAll();
//samples.DebugTest(); //uncomment if want to fire an assertion during the script execution
//Profile(); //uncomment if want to test performance of the engines
}
class EvaluatorSamples
{
public void RunAll()
{
Action<Action, string> run = (action, name) => { action(); Console.WriteLine(name + " - OK"); };
run(CompileMethod_Instance, nameof(CompileMethod_Instance));
run(CompileMethod_Static, nameof(CompileMethod_Static));
run(CreateDelegate, nameof(CreateDelegate));
run(LoadDelegate, nameof(LoadDelegate));
run(LoadCode, nameof(LoadCode));
run(LoadMethod, nameof(LoadMethod));
run(LoadMethodWithInterface, nameof(LoadMethodWithInterface));
run(LoadCode_WithInterface, nameof(LoadCode_WithInterface));
run(LoadCode_WithDuckTypedInterface, nameof(LoadCode_WithDuckTypedInterface));
}
public void CompileMethod_Instance()
{
// 1- CompileMethod wraps method into a class definition and returns compiled assembly
// 2 - CreateObject creates instance of a first class in the assembly
dynamic script = CSScript.Evaluator
.CompileMethod(@"int Sqr(int data)
{
return data * data;
}")
.CreateObject("*");
var result = script.Sqr(7);
}
public void CompileMethod_Static()
{
// 1 - CompileMethod wraps method into a class definition and returns compiled assembly
// 2 - GetStaticMethod returns duck-typed delegate that accepts 'params object[]' arguments
// Note: GetStaticMethodWithArgs can be replaced with a more convenient/shorter version
// that takes the object instead of the Type and then queries objects type internally:
// "GetStaticMethod("*.Test", data)"
var test = CSScript.Evaluator
.CompileMethod(@"using CSScriptEvaluatorApi;
static void Test(InputData data)
{
data.Index = GetIndex();
}
static int GetIndex()
{
return Environment.TickCount;
}")
.GetStaticMethodWithArgs("*.Test", typeof(InputData));
var data = new InputData();
test(data);
}
public void CreateDelegate()
{
// Wraps method into a class definition, compiles it and loads the compiled assembly.
// It returns duck-typed delegate. A delegate with 'params object[]' arguments and
// without any specific return type.
var sqr = CSScript.Evaluator
.CreateDelegate(@"int Sqr(int a)
{
return a * a;
}");
var r = sqr(3);
}
public void LoadDelegate()
{
// Wraps method into a class definition, loads the compiled assembly
// and returns the method delegate for the method, which matches the delegate specified
// as the type parameter of LoadDelegate
var product = CSScript.Evaluator
.LoadDelegate<Func<int, int, int>>(
@"int Product(int a, int b)
{
return a * b;
}");
int result = product(3, 2);
}
public void LoadCode()
{
// LoadCode compiles code and returns instance of a first class
// in the compiled assembly
dynamic script = CSScript.Evaluator
.LoadCode(@"using System;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}");
int result = script.Sum(1, 2);
}
public void LoadMethod()
{
// LoadMethod compiles code and returns instance of a first class
// in the compiled assembly.
// LoadMethod is essentially the same as LoadCode. It just deals not with the
// whole class definition but a single method(s) only. And the rest of the class definition is
// added automatically by CS-Script.
// 'public' is optional as it will be injected if the code doesn't start with it.
dynamic script = CSScript.Evaluator
.LoadMethod(@"using System;
public int Sum(int a, int b)
{
return a+b;
}");
int result = script.Sum(1, 2);
}
public void LoadMethodWithInterface()
{
// LoadMethod compiles code and returns instance of a first class
// in the compiled assembly.
// LoadMethod is essentially the same as LoadCode. It just deals not with the
// whole class definition but a single method(s) only. And the rest of the class definition is
// added automatically by CS-Script. The auto-generated class declaration also indicates
// that the class implements ICalc interface. Meaning that it will trigger compile error
// if the set of methods in the script code doesn't implement all interface members.
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
ICalc script = CSScript.Evaluator
.LoadMethod<ICalc>(
@"int Sum(int a, int b)
{
return a+b;
}");
int result = script.Sum(1, 2);
}
public void LoadCode_WithInterface()
{
// 1 - LoadCode compiles code and returns instance of a first class in the compiled assembly
// 2 - The script class implements host app interface so the returned object can be type casted into it
var script = (ICalc)CSScript.Evaluator
.LoadCode(@"using System;
public class Script : CSScriptEvaluatorApi.ICalc
{
public int Sum(int a, int b)
{
return a+b;
}
}");
int result = script.Sum(1, 2);
}
public void LoadCode_WithDuckTypedInterface()
{
// 1 - LoadCode compiles code and returns instance of a first class in the compiled assembly
// 2- The script class doesn't implement host app interface but it can still be aligned to
// one as long at it implements the interface members
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
ICalc script = CSScript.MonoEvaluator
.LoadCode<ICalc>(@"using System;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}");
int result = script.Sum(1, 2);
}
public void PerformanceTest(int count = -1)
{
var code = @"int Sqr(int a)
{
return a * a;
}";
if (count != -1)
code += "//" + count; //this unique extra code comment ensures the code to be compiled cannot be cached
dynamic script = CSScript.Evaluator
.CompileMethod(code)
.CreateObject("*");
var r = script.Sqr(3);
}
public void DebugTest()
{
//pops up an assertion dialog
CSScript.EvaluatorConfig.DebugBuild = true;
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom;
dynamic script = CSScript.Evaluator
.LoadCode(@"using System;
using System.Diagnostics;
public class Script
{
public int Sum(int a, int b)
{
Debug.Assert(false,""Testing CS-Script debugging..."");
return a+b;
}
}");
var r = script.Sum(3, 4);
}
}
public static void Profile()
{
var sw = new Stopwatch();
var samples = new EvaluatorSamples();
var count = 20;
var inxed = 0;
bool preventCaching = false;
Action run = () =>
{
sw.Restart();
for (int i = 0; i < count; i++)
if (preventCaching)
samples.PerformanceTest(inxed++);
else
samples.PerformanceTest();
Console.WriteLine(CSScript.Evaluator.GetType().Name + ": " + sw.ElapsedMilliseconds);
};
Action runAll = () =>
{
Console.WriteLine("\n---------------------------------------------");
Console.WriteLine($"Caching enabled: {!preventCaching}\n");
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.Mono;
run();
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom;
run();
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.Roslyn;
run();
};
RoslynEvaluator.LoadCompilers(); //Roslyn is extremely heavy so exclude startup time from profiling
Console.WriteLine("Testing performance");
preventCaching = true;
runAll();
preventCaching = false;
runAll();
}
}
public interface ICalc
{
int Sum(int a, int b);
}
public class InputData
{
public int Index = 0;
}
}

View File

@ -1,354 +0,0 @@
using CSScriptLibrary;
using System;
using System.Linq;
using System.IO;
using csscript;
using System.CodeDom.Compiler;
// Read in more details about all aspects of CS-Script hosting in applications
// here: http://www.csscript.net/help/Script_hosting_guideline_.html
//
// This file contains samples for the script hosting scenarios relying on CS-Script Native interface (API).
// This API is a compiler specific interface, which relies solely on CodeDom compiler. In most of the cases
// CS-Script Native model is the most flexible and natural choice
//
// Apart from Native API CS-Script offers alternative hosting model: CS-Script Evaluator, which provides
// a unified generic interface allowing dynamic switch the underlying compiling services (Mono, Roslyn, CodeDom)
// without the need for changing the hosting code.
//
// The Native interface is the original API that was designed to take maximum advantage of the dynamic C# code
// execution with CodeDom. The original implementation of this API was developed even before any compiler-as-service
// solution became available. Being based solely on CodeDOM the API doesn't utilize neither Mono nor Roslyn
// scripting solutions. Despite that CS-Script Native is the most mature, powerful and flexible API available with CS-Script.
//
// Native interface allows some unique features that are not available with CS-Script Evaluator:
// - Debugging scripts
// - Script caching
// - Script unloading
namespace CSScriptNativeApi
{
public class HostApp
{
public static void Test()
{
var host = new HostApp();
host.Log("Testing compiling services CS-Script Native API");
Console.WriteLine("---------------------------------------------");
CodeDomSamples.LoadMethod_Instance();
CodeDomSamples.LoadMethod_Static();
CodeDomSamples.LoadDelegate();
CodeDomSamples.CreateAction();
CodeDomSamples.CreateFunc();
CodeDomSamples.LoadCode();
CodeDomSamples.LoadCode_WithInterface(host);
CodeDomSamples.LoadCode_WithDuckTypedInterface(host);
CodeDomSamples.ExecuteAndUnload();
//CodeDomSamples.DebugTest(); //uncomment if want to fire an assertion during the script execution
}
public class CodeDomSamples
{
public static void LoadMethod_Instance()
{
// 1- LoadMethod wraps method into a class definition, compiles it and returns loaded assembly
// 2 - CreateObject creates instance of a first class in the assembly
dynamic script = CSScript.LoadMethod(@"int Sqr(int data)
{
return data * data;
}")
.CreateObject("*");
var result = script.Sqr(7);
}
public static void LoadMethod_Static()
{
// 1 - LoadMethod wraps method into a class definition, compiles it and returns loaded assembly
// 2 - GetStaticMethod returns first found static method as a duck-typed delegate that
// accepts 'params object[]' arguments
//
// Note: you can use GetStaticMethodWithArgs for higher precision method search: GetStaticMethodWithArgs("*.SayHello", typeof(string));
var sayHello = CSScript.LoadMethod(@"static void SayHello(string greeting)
{
Console.WriteLine(greeting);
}")
.GetStaticMethod();
sayHello("Hello World!");
}
public static void LoadDelegate()
{
// LoadDelegate wraps method into a class definition, compiles it and loads the compiled assembly.
// It returns the method delegate for the method, which matches the delegate specified
// as the type parameter of LoadDelegate
// The 'using System;' is optional; it demonstrates how to specify 'using' in the method-only syntax
var sayHello = CSScript.LoadDelegate<Action<string>>(
@"void SayHello(string greeting)
{
Console.WriteLine(greeting);
}");
sayHello("Hello World!");
}
public static void CreateAction()
{
// Wraps method into a class definition, compiles it and loads the compiled assembly.
// It returns duck-typed delegate. A delegate with 'params object[]' arguments and
// without any specific return type.
var sayHello = CSScript.CreateAction(@"void SayHello(string greeting)
{
Console.WriteLine(greeting);
}");
sayHello("Hello World!");
}
public static void CreateFunc()
{
// Wraps method into a class definition, compiles it and loads the compiled assembly.
// It returns duck-typed delegate. A delegate with 'params object[]' arguments and
// int as a return type.
var Sqr = CSScript.CreateFunc<int>(@"int Sqr(int a)
{
return a * a;
}");
int r = Sqr(3);
}
public static void LoadCode()
{
// LoadCode compiles code and returns instance of a first class
// in the compiled assembly
dynamic script = CSScript.LoadCode(@"using System;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}")
.CreateObject("*");
int result = script.Sum(1, 2);
}
public static void LoadCodeWithConfig()
{
// LoadCode compiles code and returns instance of a first class
// in the compiled assembly
string file = Path.GetTempFileName();
try
{
File.WriteAllText(file, @"using System;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}");
var settings = new Settings();
//settings = null; // set to null to foll back to defaults
dynamic script = CSScript.LoadWithConfig(file, null, false, settings, "/define:TEST")
.CreateObject("*");
int result = script.Sum(1, 2);
}
finally
{
if (File.Exists(file))
File.Delete(file);
}
}
public static void LoadCode_WithInterface(HostApp host)
{
// 1 - LoadCode compiles code and returns instance of a first class in the compiled assembly.
// 2 - The script class implements host app interface so the returned object can be type casted into it.
// 3 - In this sample host object is passed into script routine.
var calc = (ICalc) CSScript.LoadCode(@"using CSScriptNativeApi;
public class Script : ICalc
{
public int Sum(int a, int b)
{
if(Host != null)
Host.Log(""Sum is invoked"");
return a + b;
}
public HostApp Host { get; set; }
}")
.CreateObject("*");
calc.Host = host;
int result = calc.Sum(1, 2);
}
public static void LoadCode_WithDuckTypedInterface(HostApp host)
{
// 1 - LoadCode compiles code and returns instance of a first class in the compiled assembly
// 2- The script class doesn't implement host app interface but it can still be aligned to
// one as long at it implements the interface members
// 3 - In this sample host object is passed into script routine.
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
ICalc calc = CSScript.LoadCode(@"using CSScriptNativeApi;
public class Script
{
public int Sum(int a, int b)
{
if(Host != null)
Host.Log(""Sum is invoked"");
return a + b;
}
public HostApp Host { get; set; }
}")
.CreateObject("*")
.AlignToInterface<ICalc>();
calc.Host = host;
int result = calc.Sum(1, 2);
}
public static void ExecuteAndUnload()
{
// The script will be loaded into a temporary AppDomain and unloaded after the execution.
// Note: remote execution is a subject of some restrictions associated with the nature of the
// CLR cross-AppDomain interaction model:
// * the script class must be serializable or derived from MarshalByRefObject.
//
// * any object (call arguments, return objects) that crosses ApPDomain boundaries
// must be serializable or derived from MarshalByRefObject.
//
// * long living script class instances may get disposed in remote domain even if they are
// being referenced in the current AppDomain. You need to use the usual .NET techniques
// to prevent that. See LifetimeManagement.cs sample for details.
//This use-case uses Interface Alignment and this requires all assemblies involved to have
//non-empty Assembly.Location
CSScript.GlobalSettings.InMemoryAssembly = false;
var code = @"using System;
public class Script : MarshalByRefObject
{
public void Hello(string greeting)
{
Console.WriteLine(greeting);
}
}";
//Note: usage of helper.CreateAndAlignToInterface<IScript>("Script") is also acceptable
using (var helper = new AsmHelper(CSScript.CompileCode(code), null, deleteOnExit: true))
{
IScript script = helper.CreateAndAlignToInterface<IScript>("*");
script.Hello("Hi there...");
}
//from this point AsmHelper is disposed and the temp AppDomain is unloaded
}
public static void DebugTest()
{
//pops up an assertion dialog
dynamic script = CSScript.LoadCode(@"using System;
using System.Diagnostics;
public class Script
{
public int Sum(int a, int b)
{
Debug.Assert(false,""Testing CS-Script debugging..."");
return a+b;
}
}", null, debugBuild: true).CreateObject("*");
int result = script.Sum(1, 2);
}
}
public void Log(string message)
{
Console.WriteLine(message);
}
}
public interface IScript
{
void Hello(string greeting);
}
public interface ICalc
{
HostApp Host { get; set; }
int Sum(int a, int b);
}
public class Samples
{
static public void CompilingHistory()
{
string script = Path.GetTempFileName();
string scriptAsm = script + ".dll";
CSScript.KeepCompilingHistory = true;
try
{
File.WriteAllText(script, @"using System;
using System.Windows.Forms;
public class Script
{
public int Sum(int a, int b)
{
return a+b;
}
}");
CSScript.CompileFile(script, scriptAsm, false, null);
CompilingInfo info = CSScript.CompilingHistory
.Values
.FirstOrDefault(item => item.ScriptFile == script);
if (info != null)
{
Console.WriteLine("Script: " + info.ScriptFile);
Console.WriteLine("Referenced assemblies:");
foreach (string asm in info.Input.ReferencedAssemblies)
Console.WriteLine(asm);
if (info.Result.Errors.HasErrors)
{
foreach (CompilerError err in info.Result.Errors)
if (!err.IsWarning)
Console.WriteLine("Error: " + err.ErrorText);
}
}
CSScript.CompilingHistory.Clear();
}
finally
{
CSScript.KeepCompilingHistory = false;
}
}
}
}

View File

@ -2,15 +2,12 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Artemis.Core.Events;
using Artemis.Core.Exceptions;
using Artemis.Core.Services.Interfaces;
using Artemis.Plugins.Interfaces;
using Artemis.Plugins.Models;
using CSScriptLibrary;
using Newtonsoft.Json;
using Ninject;
namespace Artemis.Core.Services
@ -24,7 +21,7 @@ namespace Artemis.Core.Services
{
_kernel = kernel;
_plugins = new List<PluginInfo>();
if (!Directory.Exists(Constants.DataFolder + "plugins"))
Directory.CreateDirectory(Constants.DataFolder + "plugins");
}
@ -41,12 +38,18 @@ namespace Artemis.Core.Services
OnStartedLoadingPlugins();
// Empty the list of plugins
foreach (var pluginInfo in _plugins)
pluginInfo.Dispose();
_plugins.Clear();
// Load all built-in plugins
foreach (var builtInPlugin in _kernel.GetAll<IPlugin>())
_plugins.Add(PluginInfo.FromBuiltInPlugin(_kernel, builtInPlugin));
// Iterate all plugin folders and load each plugin
foreach (var directory in Directory.GetDirectories(Constants.DataFolder + "plugins"))
_plugins.Add(await LoadPluginFromFolder(directory));
_plugins.Add(await PluginInfo.FromFolder(_kernel, directory));
OnFinishedLoadedPlugins();
}
@ -57,44 +60,15 @@ namespace Artemis.Core.Services
public async Task<IModuleViewModel> GetModuleViewModel(PluginInfo pluginInfo)
{
// Don't attempt to locave VMs for something other than a module
if (pluginInfo.Plugin is IModule)
throw new ArtemisPluginException(pluginInfo, "Cannot locate a view model for this plugin as it's not a module.");
// Compile the ViewModel and get the type
var compile = await Task.Run(() => CSScript.LoadFile(pluginInfo.Folder + pluginInfo.ViewModel));
var vmType = compile.ExportedTypes.FirstOrDefault(t => typeof(IModuleViewModel).IsAssignableFrom(t));
if (vmType == null)
throw new ArtemisPluginException(pluginInfo, "Cannot locate a view model for this module.");
// Instantiate the ViewModel with Ninject
var vm = (IModuleViewModel) _kernel.Get(vmType);
vm.PluginInfo = pluginInfo;
return vm;
return await pluginInfo.GetModuleViewModel(_kernel);
}
public void Dispose()
{
}
private async Task<PluginInfo> LoadPluginFromFolder(string folder)
{
if (!folder.EndsWith("\\"))
folder += "\\";
if (!File.Exists(folder + "plugin.json"))
throw new ArtemisPluginException(null, "Failed to load plugin, no plugin.json found in " + folder);
var pluginInfo = JsonConvert.DeserializeObject<PluginInfo>(File.ReadAllText(folder + "plugin.json"));
pluginInfo.Folder = folder;
// Load the main plugin which will contain a class implementing IPlugin
var plugin = await CSScript.Evaluator.LoadFileAsync<IPlugin>(folder + pluginInfo.Main);
pluginInfo.Plugin = plugin;
return pluginInfo;
}
#region Events
public event EventHandler<PluginEventArgs> PluginLoaded;
public event EventHandler<PluginEventArgs> PluginReloaded;
public event EventHandler StartedLoadingPlugins;

View File

@ -5,9 +5,14 @@ using Artemis.Core.Events;
using Artemis.Core.Services.Interfaces;
using RGB.NET.Brushes;
using RGB.NET.Core;
using RGB.NET.Devices.Asus;
using RGB.NET.Devices.CoolerMaster;
using RGB.NET.Devices.Corsair;
using RGB.NET.Devices.DMX;
using RGB.NET.Devices.Logitech;
using RGB.NET.Devices.Msi;
using RGB.NET.Devices.Novation;
using RGB.NET.Devices.Razer;
using RGB.NET.Groups;
namespace Artemis.Core.Services
@ -38,24 +43,18 @@ namespace Artemis.Core.Services
await Task.Run(() =>
{
// TODO SpoinkyNL 8-1-18: Keep settings into account
// Surface.LoadDevices(AsusDeviceProvider.Instance);
Surface.LoadDevices(CorsairDeviceProvider.Instance);
Surface.LoadDevices(LogitechDeviceProvider.Instance);
Surface.LoadDevices(AsusDeviceProvider.Instance);
Surface.LoadDevices(CoolerMasterDeviceProvider.Instance);
// Surface.LoadDevices(NovationDeviceProvider.Instance);
Surface.LoadDevices(CorsairDeviceProvider.Instance);
Surface.LoadDevices(DMXDeviceProvider.Instance);
Surface.LoadDevices(LogitechDeviceProvider.Instance);
Surface.LoadDevices(NovationDeviceProvider.Instance);
Surface.LoadDevices(MsiDeviceProvider.Instance);
Surface.LoadDevices(RazerDeviceProvider.Instance);
// TODO SpoinkyNL 8-1-18: Load alignment
Surface.AlignDevices();
// Do some testing, why does this work, how does it know I want to target the surface? Check source!
var mouse1 = Surface.Leds.First(l => l.Id == LedId.Mouse1);
mouse1.Color = new Color(255, 0, 0);
var mouse2 = Surface.Leds.First(l => l.Id == LedId.Mouse2);
mouse2.Color = new Color(255, 255, 0);
var mouse3 = Surface.Leds.First(l => l.Id == LedId.Mouse3);
mouse3.Color = new Color(255, 255, 255);
var mouse4 = Surface.Leds.First(l => l.Id == LedId.Mouse4);
mouse4.Color = new Color(255, 0, 255);
Surface.UpdateMode = UpdateMode.Continuous;
});

View File

@ -63,6 +63,10 @@
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.CodeAnalysis.CSharp" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.0.0" newVersion="2.6.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,14 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="4.2.1" targetFramework="net46" />
<package id="CS-Script" version="3.28.0.1" targetFramework="net46" />
<package id="CS-Script.bin" version="3.28.0.1" targetFramework="net46" />
<package id="HidSharp" version="1.5" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.Analyzers" version="2.6.0" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.CodeAnalysis.Common" version="2.6.1" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.CSharp" version="2.6.1" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.CSharp.Scripting" version="2.6.1" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.Scripting.Common" version="2.6.1" targetFramework="net46" />
<package id="Newtonsoft.Json" version="11.0.1" targetFramework="net46" />
<package id="Ninject" version="3.3.4" targetFramework="net46" />
<package id="Ninject.Extensions.Conventions" version="3.3.0" targetFramework="net46" />

View File

@ -30,6 +30,24 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="CSScriptLibrary, Version=3.28.0.0, Culture=neutral, PublicKeyToken=70fcc3d18c749033, processorArchitecture=MSIL">
<HintPath>..\packages\CS-Script.bin.3.28.0.1\lib\net46\CSScriptLibrary.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeAnalysis, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.Common.2.0.0\lib\netstandard1.3\Microsoft.CodeAnalysis.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeAnalysis.CSharp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.2.0.0\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeAnalysis.CSharp.Scripting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.Scripting.2.0.0\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.Scripting.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeAnalysis.Scripting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.CodeAnalysis.Scripting.Common.2.0.0\lib\netstandard1.3\Microsoft.CodeAnalysis.Scripting.dll</HintPath>
</Reference>
<Reference Include="Mono.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\CS-Script.bin.3.28.0.1\lib\net46\Mono.CSharp.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
@ -40,16 +58,84 @@
<HintPath>..\packages\Stylet.1.1.21\lib\net45\Stylet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.FileVersionInfo, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.StackTrace, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Reflection.Metadata, Version=1.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net46\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net46\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Text.Encoding.CodePages, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Thread, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
</Reference>
<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="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XmlDocument, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XPath, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll</HintPath>
</Reference>
<Reference Include="System.Xml.XPath.XDocument, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Abstract\ModuleViewModel.cs" />
<Compile Include="Exceptions\ArtemisPluginException.cs" />
<Compile Include="Interfaces\IDataModelExpansion.cs" />
<Compile Include="Interfaces\IDevice.cs" />
<Compile Include="Interfaces\ILayerType.cs" />
@ -60,7 +146,12 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.1.1.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll" />
<Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.1.1.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,25 @@
using System;
using Artemis.Plugins.Models;
namespace Artemis.Plugins.Exceptions
{
public class ArtemisPluginException : Exception
{
public ArtemisPluginException(PluginInfo pluginInfo)
{
PluginInfo = pluginInfo;
}
public ArtemisPluginException(PluginInfo pluginInfo, string message) : base(message)
{
PluginInfo = pluginInfo;
}
public ArtemisPluginException(PluginInfo pluginInfo, string message, Exception inner) : base(message, inner)
{
PluginInfo = pluginInfo;
}
public PluginInfo PluginInfo { get; }
}
}

View File

@ -1,9 +1,18 @@
using Artemis.Plugins.Interfaces;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Artemis.Plugins.Exceptions;
using Artemis.Plugins.Interfaces;
using CSScriptLibrary;
using Newtonsoft.Json;
using Ninject;
namespace Artemis.Plugins.Models
{
public class PluginInfo
public class PluginInfo : IDisposable
{
/// <summary>
/// The name of the plugin
@ -36,5 +45,53 @@ namespace Artemis.Plugins.Models
/// </summary>
[JsonIgnore]
public string Folder { get; set; }
/// <summary>
/// Indicates wether this is a built-in plugin. Built-in plugins are precompiled and have no files
/// </summary>
[JsonIgnore]
public bool IsBuiltIn { get; private set; }
public static async Task<PluginInfo> FromFolder(IKernel kernel, string folder)
{
if (!folder.EndsWith("\\"))
folder += "\\";
if (!File.Exists(folder + "plugin.json"))
throw new ArtemisPluginException(null, "Failed to load plugin, no plugin.json found in " + folder);
var pluginInfo = JsonConvert.DeserializeObject<PluginInfo>(File.ReadAllText(folder + "plugin.json"));
pluginInfo.Folder = folder;
// Load the main plugin which will contain a class implementing IPlugin
var assembly = await CSScript.Evaluator.CompileCodeAsync(File.ReadAllText(folder + pluginInfo.Main));
var pluginType = assembly.GetTypes().Where(t => typeof(IPlugin).IsAssignableFrom(t)).ToList();
if (!pluginType.Any())
throw new ArtemisPluginException(pluginInfo, "Failed to load plugin, no type found that implements IPlugin");
if (pluginType.Count > 1)
throw new ArtemisPluginException(pluginInfo, "Failed to load plugin, more than one type found that implements IPlugin");
pluginInfo.Plugin = (IPlugin) kernel.Get(pluginType.First());
pluginInfo.Plugin.LoadPlugin();
return pluginInfo;
}
public static PluginInfo FromBuiltInPlugin(IKernel kernel, IPlugin builtInPlugin)
{
var pluginInfo = new PluginInfo
{
Name = builtInPlugin.GetType().Name,
Version = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion,
Plugin = builtInPlugin,
IsBuiltIn = true
};
pluginInfo.Plugin.LoadPlugin();
return pluginInfo;
}
public void Dispose()
{
}
}
}

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.1.0" newVersion="1.2.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.FileVersionInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,6 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CS-Script.bin" version="3.28.0.1" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.Analyzers" version="1.1.0" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.Common" version="2.0.0" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.CSharp" version="2.0.0" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.CSharp.Scripting" version="2.0.0" targetFramework="net46" />
<package id="Microsoft.CodeAnalysis.Scripting.Common" version="2.0.0" targetFramework="net46" />
<package id="Newtonsoft.Json" version="11.0.1" targetFramework="net46" />
<package id="Ninject" version="3.3.4" targetFramework="net46" />
<package id="Stylet" version="1.1.21" targetFramework="net46" />
<package id="System.AppContext" version="4.3.0" targetFramework="net46" />
<package id="System.Collections" version="4.3.0" targetFramework="net46" />
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net46" />
<package id="System.Collections.Immutable" version="1.3.1" targetFramework="net46" />
<package id="System.Console" version="4.3.0" targetFramework="net46" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net46" />
<package id="System.Diagnostics.FileVersionInfo" version="4.3.0" targetFramework="net46" />
<package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="net46" />
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net46" />
<package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net46" />
<package id="System.Globalization" version="4.3.0" targetFramework="net46" />
<package id="System.IO" version="4.3.0" targetFramework="net46" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net46" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net46" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net46" />
<package id="System.Linq" version="4.3.0" targetFramework="net46" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net46" />
<package id="System.Reflection" version="4.3.0" targetFramework="net46" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net46" />
<package id="System.Reflection.Metadata" version="1.4.2" targetFramework="net46" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net46" />
<package id="System.Runtime" version="4.3.0" targetFramework="net46" />
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net46" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net46" />
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net46" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net46" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net46" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net46" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net46" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net46" />
<package id="System.Text.Encoding.CodePages" version="4.3.0" targetFramework="net46" />
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net46" />
<package id="System.Threading" version="4.3.0" targetFramework="net46" />
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net46" />
<package id="System.Threading.Tasks.Parallel" version="4.3.0" targetFramework="net46" />
<package id="System.Threading.Thread" version="4.3.0" targetFramework="net46" />
<package id="System.ValueTuple" version="4.3.0" targetFramework="net46" />
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net46" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net46" />
<package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="net46" />
<package id="System.Xml.XPath" version="4.3.0" targetFramework="net46" />
<package id="System.Xml.XPath.XDocument" version="4.3.0" targetFramework="net46" />
</packages>

View File

@ -66,6 +66,10 @@
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.CodeAnalysis.CSharp" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.0.0" newVersion="2.6.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -30,12 +30,6 @@
<ResourceDictionary
Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Teal.xaml" />
<!-- Material Design: MahApps Compatibility -->
<ResourceDictionary
Source="pack://application:,,,/MaterialDesignThemes.MahApps;component/Themes/MaterialDesignTheme.MahApps.Fonts.xaml" />
<ResourceDictionary
Source="pack://application:,,,/MaterialDesignThemes.MahApps;component/Themes/MaterialDesignTheme.MahApps.Flyout.xaml" />
<!-- Artemis -->
<ResourceDictionary Source="Styles/Visualizers/RGBSurfaceVisualizer.xaml"></ResourceDictionary>
<ResourceDictionary Source="Styles/Visualizers/RGBDeviceVisualizer.xaml"></ResourceDictionary>

View File

@ -69,61 +69,47 @@
<Reference Include="PropertyChanged, Version=2.2.6.0, Culture=neutral, PublicKeyToken=ee3ee20bcf148ddd, processorArchitecture=MSIL">
<HintPath>..\packages\PropertyChanged.Fody.2.2.6\lib\net452\PropertyChanged.dll</HintPath>
</Reference>
<Reference Include="RGB.NET.Brushes">
<Reference Include="RGB.NET.Brushes, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Brushes.0.0.1.38\lib\net45\RGB.NET.Brushes.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Core">
<Reference Include="RGB.NET.Core, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Core.0.0.1.38\lib\net45\RGB.NET.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Decorators">
<Reference Include="RGB.NET.Decorators, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Decorators.0.0.1.38\lib\net45\RGB.NET.Decorators.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Asus">
<Reference Include="RGB.NET.Devices.Asus, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Asus.0.0.1.38\lib\net45\RGB.NET.Devices.Asus.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.CoolerMaster">
<Reference Include="RGB.NET.Devices.CoolerMaster, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\lib\net45\RGB.NET.Devices.CoolerMaster.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Corsair">
<Reference Include="RGB.NET.Devices.Corsair, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Corsair.0.0.1.38\lib\net45\RGB.NET.Devices.Corsair.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.DMX">
<Reference Include="RGB.NET.Devices.DMX, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.DMX.0.0.1.38\lib\net45\RGB.NET.Devices.DMX.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Logitech">
<Reference Include="RGB.NET.Devices.Logitech, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Logitech.0.0.1.38\lib\net45\RGB.NET.Devices.Logitech.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Msi">
<Reference Include="RGB.NET.Devices.Msi, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Msi.0.0.1.38\lib\net45\RGB.NET.Devices.Msi.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Novation">
<Reference Include="RGB.NET.Devices.Novation, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Novation.0.0.1.38\lib\net45\RGB.NET.Devices.Novation.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Devices.Razer">
<Reference Include="RGB.NET.Devices.Razer, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Devices.Razer.0.0.1.38\lib\net45\RGB.NET.Devices.Razer.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Groups">
<Reference Include="RGB.NET.Groups, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Groups.0.0.1.38\lib\net45\RGB.NET.Groups.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Input">
<Reference Include="RGB.NET.Input, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Input.0.0.1.38\lib\net45\RGB.NET.Input.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RGB.NET.Input.Corsair">
<Reference Include="RGB.NET.Input.Corsair, Version=0.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RGB.NET.Input.Corsair.0.0.1.38\lib\net45\RGB.NET.Input.Corsair.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Sanford.Multimedia.Midi, Version=6.6.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Sanford.Multimedia.Midi.6.6.0\lib\net20\Sanford.Multimedia.Midi.dll</HintPath>
@ -261,23 +247,23 @@
<Resource Include="FodyWeavers.xml" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Fody.2.4.2\build\Fody.targets" Condition="Exists('..\packages\Fody.2.4.2\build\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Fody.2.4.2\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.2.4.2\build\Fody.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets'))" />
<Error Condition="!Exists('..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets'))" />
</Target>
<Import Project="..\packages\Fody.2.4.2\build\Fody.targets" Condition="Exists('..\packages\Fody.2.4.2\build\Fody.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets" Condition="Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" />
</Target>
<Import Project="..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets" Condition="Exists('..\packages\RGB.NET.Devices.Asus.0.0.1.38\build\net45\RGB.NET.Devices.Asus.targets')" />
<Import Project="..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets" Condition="Exists('..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.38\build\net45\RGB.NET.Devices.CoolerMaster.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets" Condition="Exists('..\packages\RGB.NET.Devices.Corsair.0.0.1.38\build\net45\RGB.NET.Devices.Corsair.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets" Condition="Exists('..\packages\RGB.NET.Devices.Logitech.0.0.1.38\build\net45\RGB.NET.Devices.Logitech.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets" Condition="Exists('..\packages\RGB.NET.Devices.Msi.0.0.1.38\build\net45\RGB.NET.Devices.Msi.targets')" />
<Import Project="..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets" Condition="Exists('..\packages\RGB.NET.Devices.Razer.0.0.1.38\build\net45\RGB.NET.Devices.Razer.targets')" />
</Project>

View File

@ -0,0 +1,28 @@
using System;
using Artemis.Plugins.Interfaces;
namespace Artemis.BuiltIn.Module.General
{
public class GeneralModule : IModule
{
public void LoadPlugin()
{
throw new NotImplementedException();
}
public void UnloadPlugin()
{
throw new NotImplementedException();
}
public void Update(double deltaTime)
{
throw new NotImplementedException();
}
public void Render(double deltaTime)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,12 @@
<UserControl x:Class="Artemis.BuiltIn.Module.General.GeneralView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.BuiltIn.Module.General"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</UserControl>

View File

@ -0,0 +1,15 @@
using System.Windows.Controls;
namespace Artemis.BuiltIn.Module.General
{
/// <summary>
/// Interaction logic for GeneralView.xaml
/// </summary>
public partial class GeneralView : UserControl
{
public GeneralView()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,6 @@
namespace Artemis.BuiltIn.Module.General
{
public class GeneralViewModel
{
}
}

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" 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>{58113CC5-A9CA-4EC3-AB4E-3C94B99268D8}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Artemis.BuiltIn.Module.General</RootNamespace>
<AssemblyName>Module.General</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</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="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<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="GeneralModule.cs" />
<Compile Include="GeneralView.xaml.cs">
<DependentUpon>GeneralView.xaml</DependentUpon>
</Compile>
<Compile Include="GeneralViewModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Artemis.Plugins\Artemis.Plugins.csproj">
<Project>{CD23BC5E-57F0-46CE-A007-24D031146219}</Project>
<Name>Artemis.Plugins</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Page Include="GeneralView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -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("Module.General")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Module.General")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[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("58113cc5-a9ca-4ec3-ab4e-3c94b99268d8")]
// 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")]

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.1.0" newVersion="1.2.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.FileVersionInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>