diff --git a/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj b/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj
new file mode 100644
index 0000000..bbde65d
--- /dev/null
+++ b/ADO.ExecuteCommand.Core/ADO.ExecuteCommand.Core.xproj
@@ -0,0 +1,21 @@
+
+
+
+ 14.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+
+
+
+
+ b7737b4f-4c59-4ce5-aa62-0a6cca639473
+ ADO.ExecuteCommand.Core
+ .\obj
+ .\bin\
+ v4.5
+
+
+
+ 2.0
+
+
+
diff --git a/ADO.ExecuteCommand/Commands/Command.cs b/ADO.ExecuteCommand.Core/Commands/Command.cs
similarity index 100%
rename from ADO.ExecuteCommand/Commands/Command.cs
rename to ADO.ExecuteCommand.Core/Commands/Command.cs
diff --git a/ADO.ExecuteCommand/Commands/CommandBatch.cs b/ADO.ExecuteCommand.Core/Commands/CommandBatch.cs
similarity index 100%
rename from ADO.ExecuteCommand/Commands/CommandBatch.cs
rename to ADO.ExecuteCommand.Core/Commands/CommandBatch.cs
diff --git a/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs b/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs
new file mode 100644
index 0000000..b13147d
--- /dev/null
+++ b/ADO.ExecuteCommand.Core/Helper/CommandHelper.Factory.cs
@@ -0,0 +1,34 @@
+using System;
+
+namespace ADO.ExecuteCommand.Helper
+{
+ public abstract partial class CommandHelper
+ {
+ #region - Factory -
+
+ public static CommandHelper CreateHelper(DataAccessSectionSettings settings)
+ {
+ try
+ {
+ var providerType = settings.Type;
+
+ var daType = Type.GetType(providerType);
+ if (daType == null) throw new NullReferenceException("Null Reference in Provider type configuration Session.");
+
+ var provider = Activator.CreateInstance(daType, settings.ConnectionString);
+ if (provider is CommandHelper)
+ {
+ return provider as CommandHelper;
+ }
+
+ throw new Exception("The provider specified does not extends the QueryRunner abstract class.");
+ }
+ catch (Exception e)
+ {
+ throw new Exception("If the section is not defined on the configuration file this method can't be used to create an QueryRunner instance.", e);
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/ADO.ExecuteCommand/Helper/CommandHelper.cs b/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs
similarity index 60%
rename from ADO.ExecuteCommand/Helper/CommandHelper.cs
rename to ADO.ExecuteCommand.Core/Helper/CommandHelper.cs
index a4ac2d9..f2a9d57 100644
--- a/ADO.ExecuteCommand/Helper/CommandHelper.cs
+++ b/ADO.ExecuteCommand.Core/Helper/CommandHelper.cs
@@ -1,60 +1,28 @@
using System;
-using System.Collections;
using System.Collections.Generic;
-using System.Configuration;
using System.Data;
using System.Linq;
using ADO.ExecuteCommand.Commands;
namespace ADO.ExecuteCommand.Helper
{
- public abstract class CommandHelper
+ public abstract partial class CommandHelper
{
#region Declare members
- protected static Hashtable ParamCache = Hashtable.Synchronized(new Hashtable());
- protected static string ConnectionString;
+ protected string ConnectionString;
#endregion
+ protected CommandHelper(string connectionString)
+ {
+ this.ConnectionString = connectionString;
+ }
+
#region Provider specific abstract methods
public abstract IDbConnection GetConnection();
protected abstract IDataParameter GetParameter();
- protected abstract IDbDataAdapter GetDataAdapter();
- protected abstract void DeriveParameters(IDbCommand cmd);
- protected abstract DataTable FillTable(IDbDataAdapter da);
-
- #endregion
-
- #region Factory
-
- public static CommandHelper CreateHelper(string providerAlias)
- {
- try
- {
- var dict = ConfigurationManager.GetSection("DataCommandProviders") as IDictionary;
- if (dict == null) throw new Exception("Null Reference in DataAccess Provider configuration Session.");
-
- var providerConfig = dict[providerAlias] as ProviderAlias;
- if (providerConfig == null) throw new Exception("Null Reference in Provider Alias configuration Session.");
-
- var providerType = providerConfig.TypeName;
- ConnectionString = providerConfig.ConnectionString;
-
- var daType = Type.GetType(providerType);
- if (daType == null) throw new Exception("Null Reference in Provider type configuration Session.");
-
- var provider = daType.Assembly.CreateInstance(daType.FullName);
- if (provider is CommandHelper) return provider as CommandHelper;
-
- throw new Exception("The provider specified does not extends the AdoHelper abstract class.");
- }
- catch (Exception e)
- {
- throw new Exception("If the section is not defined on the configuration file this method can't be used to create an AdoHelper instance.", e);
- }
- }
#endregion
@@ -86,55 +54,6 @@ protected virtual void AttachParameters(IDbCommand command, IDataParameter[] com
}
}
- protected void AssignParameterValues(IDataParameter[] commandParameters, DataRow dataRow)
- {
- if ((commandParameters == null) || (dataRow == null))
- {
- return;
- }
-
- var columns = dataRow.Table.Columns;
-
- var i = 0;
- foreach (var commandParameter in commandParameters)
- {
- if (commandParameter.ParameterName == null || commandParameter.ParameterName.Length <= 1)
- throw new Exception($"Please provide a valid parameter name on the parameter #{i}, the ParameterName property has the following value: '{commandParameter.ParameterName}'.");
-
- if (columns.Contains(commandParameter.ParameterName)) commandParameter.Value = dataRow[commandParameter.ParameterName];
- else if (columns.Contains(commandParameter.ParameterName.Substring(1))) commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
-
- i++;
- }
- }
-
- protected void AssignParameterValues(IDataParameter[] commandParameters, object[] parameterValues)
- {
- if ((commandParameters == null) || (parameterValues == null))
- {
- return;
- }
-
- if (commandParameters.Length != parameterValues.Length)
- {
- throw new ArgumentException("Parameter count does not match Parameter Value count.");
- }
-
- for (var i = 0; i < commandParameters.Length; i++)
- {
- var param = parameterValues[i] as IDataParameter;
- if (param != null)
- {
- var paramInstance = param;
- commandParameters[i].Value = paramInstance.Value ?? DBNull.Value;
-
- continue;
- }
-
- commandParameters[i].Value = parameterValues[i] ?? DBNull.Value;
- }
- }
-
protected virtual bool PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters)
{
var mustCloseConnection = false;
@@ -167,10 +86,6 @@ protected virtual bool PrepareCommand(IDbCommand command, IDbConnection connecti
return mustCloseConnection;
}
- protected virtual void ClearCommand(IDbCommand command)
- {
- }
-
#endregion private utility methods
#region ExecuteNonCommand
diff --git a/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs b/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs
new file mode 100644
index 0000000..adabae2
--- /dev/null
+++ b/ADO.ExecuteCommand.Core/Helper/DataAccessSectionSettings.cs
@@ -0,0 +1,14 @@
+namespace ADO.ExecuteCommand.Helper
+{
+ public class DataAccessSectionSettings
+ {
+ public DataAccessSectionSettings(string type, string connectionString)
+ {
+ Type = type;
+ ConnectionString = connectionString;
+ }
+
+ public string Type { get; }
+ public string ConnectionString { get; }
+ }
+}
diff --git a/ADO.ExecuteCommand/Helper/MsSql.cs b/ADO.ExecuteCommand.Core/Helper/MsSql.cs
similarity index 64%
rename from ADO.ExecuteCommand/Helper/MsSql.cs
rename to ADO.ExecuteCommand.Core/Helper/MsSql.cs
index 95ecf46..8cbe7e4 100644
--- a/ADO.ExecuteCommand/Helper/MsSql.cs
+++ b/ADO.ExecuteCommand.Core/Helper/MsSql.cs
@@ -7,6 +7,10 @@ namespace ADO.ExecuteCommand.Helper
{
public class MsSql : CommandHelper
{
+ public MsSql(string connectionString) : base(connectionString)
+ {
+ }
+
public override IDbConnection GetConnection()
{
if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString");
@@ -28,24 +32,5 @@ protected override IDataParameter GetParameter()
{
return new SqlParameter();
}
-
- protected override IDbDataAdapter GetDataAdapter()
- {
- return new SqlDataAdapter();
- }
-
- protected override void DeriveParameters(IDbCommand cmd)
- {
- if (!(cmd is SqlCommand)) throw new ArgumentException("The command provided is not a SqlCommand instance.", nameof(cmd));
- SqlCommandBuilder.DeriveParameters((SqlCommand)cmd);
- }
-
- protected override DataTable FillTable(IDbDataAdapter da)
- {
- var dt = new DataTable();
- ((SqlDataAdapter)da).Fill(dt);
-
- return dt;
- }
}
}
diff --git a/ADO.ExecuteCommand/Helper/PgSql.cs b/ADO.ExecuteCommand.Core/Helper/PgSql.cs
similarity index 56%
rename from ADO.ExecuteCommand/Helper/PgSql.cs
rename to ADO.ExecuteCommand.Core/Helper/PgSql.cs
index ed93f31..3e56b4e 100644
--- a/ADO.ExecuteCommand/Helper/PgSql.cs
+++ b/ADO.ExecuteCommand.Core/Helper/PgSql.cs
@@ -6,6 +6,10 @@ namespace ADO.ExecuteCommand.Helper
{
public class PgSql : CommandHelper
{
+ public PgSql(string connectionString) : base(connectionString)
+ {
+ }
+
public override IDbConnection GetConnection()
{
if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString");
@@ -22,24 +26,5 @@ protected override IDataParameter GetParameter()
{
return new NpgsqlParameter();
}
-
- protected override IDbDataAdapter GetDataAdapter()
- {
- return new NpgsqlDataAdapter();
- }
-
- protected override void DeriveParameters(IDbCommand cmd)
- {
- if (!(cmd is NpgsqlCommand)) throw new ArgumentException("The command provided is not a NpgSqlCommand instance.", nameof(cmd));
- NpgsqlCommandBuilder.DeriveParameters((NpgsqlCommand)cmd);
- }
-
- protected override DataTable FillTable(IDbDataAdapter da)
- {
- var dt = new DataTable();
- ((NpgsqlDataAdapter)da).Fill(dt);
-
- return dt;
- }
}
}
diff --git a/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs b/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..055d60e
--- /dev/null
+++ b/ADO.ExecuteCommand.Core/Properties/AssemblyInfo.cs
@@ -0,0 +1,19 @@
+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: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ADO.ExecuteCommand.Core")]
+[assembly: AssemblyTrademark("")]
+
+// 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("b7737b4f-4c59-4ce5-aa62-0a6cca639473")]
diff --git a/ADO.ExecuteCommand.Core/project.json b/ADO.ExecuteCommand.Core/project.json
new file mode 100644
index 0000000..2e7bc9f
--- /dev/null
+++ b/ADO.ExecuteCommand.Core/project.json
@@ -0,0 +1,17 @@
+{
+ "version": "1.0.0-*",
+
+ "dependencies": {
+ "NETStandard.Library": "1.6.0",
+ "Npgsql": "3.1.8",
+ "System.Collections.NonGeneric": "4.0.1",
+ "System.Data.Common": "4.1.0",
+ "System.Data.SqlClient": "4.1.0"
+ },
+
+ "frameworks": {
+ "netstandard1.4": {
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs b/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs
index 696b376..71243a0 100644
--- a/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs
+++ b/ADO.ExecuteCommand.Test/AdoMocks/MockCommandHelper.cs
@@ -12,6 +12,10 @@ public class MockCommandHelper : CommandHelper
{
private IList parameters;
+ public MockCommandHelper(string connectionString) : base(connectionString)
+ {
+ }
+
public IList> ReturnValues { get; set; }
public override IDbConnection GetConnection()
@@ -42,46 +46,6 @@ protected override IDataParameter GetParameter()
return parameter;
}
- protected override IDbDataAdapter GetDataAdapter()
- {
- var dba = MockRepository.GenerateMock();
- dba.Expect(da => da.SelectCommand);
-
- return dba;
- }
-
- protected override void DeriveParameters(IDbCommand cmd)
- {
- throw new NotImplementedException();
- }
-
- protected override DataTable FillTable(IDbDataAdapter da)
- {
- if (this.ReturnValues == null || !this.ReturnValues.Any()) throw new NoNullAllowedException();
-
- var dt = new DataTable();
- dt.Clear();
-
- foreach (var col in this.ReturnValues[0].Keys)
- {
- dt.Columns.Add(col);
- }
-
- foreach (var rows in this.ReturnValues)
- {
- var row = dt.NewRow();
-
- foreach (var returnValue in rows)
- {
- row[returnValue.Key] = returnValue.Value;
- }
-
- dt.Rows.Add(row);
- }
-
- return dt;
- }
-
public IEnumerable Parameters => this.parameters;
}
}
diff --git a/ADO.ExecuteCommand.Test/ParametersTest.cs b/ADO.ExecuteCommand.Test/ParametersTest.cs
index 0c657ba..e8232da 100644
--- a/ADO.ExecuteCommand.Test/ParametersTest.cs
+++ b/ADO.ExecuteCommand.Test/ParametersTest.cs
@@ -13,7 +13,7 @@ public class ParametersTest
[TestMethod]
public void TestParametersInQuery()
{
- var commandHelper = new MockCommandHelper
+ var commandHelper = new MockCommandHelper(null)
{
ReturnValues = new List>
{
@@ -43,7 +43,7 @@ public void TestParametersInQuery()
[TestMethod]
public void TestNullParametersInQuery()
{
- var queryRunner = new MockCommandHelper
+ var queryRunner = new MockCommandHelper(null)
{
ReturnValues = new List>
{
diff --git a/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs b/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs
index 83dcc7a..6dc74d2 100644
--- a/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs
+++ b/ADO.ExecuteCommand.Test/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
// 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")]
+[assembly: AssemblyVersion("1.0.0.1")]
+[assembly: AssemblyFileVersion("1.0.0.1")]
diff --git a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj
index 4cac692..8924892 100644
--- a/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj
+++ b/ADO.ExecuteCommand/ADO.ExecuteCommand.csproj
@@ -45,16 +45,12 @@
4
-
- ..\packages\Npgsql.2.2.5\lib\net45\Mono.Security.dll
- True
-
..\packages\MySql.Data.6.9.8\lib\net45\MySql.Data.dll
True
-
- ..\packages\Npgsql.2.2.5\lib\net45\Npgsql.dll
+
+ ..\packages\Npgsql.3.1.8\lib\net45\Npgsql.dll
True
@@ -68,14 +64,28 @@
-
-
-
+
+ Commands\Command.cs
+
+
+ Commands\CommandBatch.cs
+
+
+ Helper\CommandHelper.cs
+
+
+ Helper\DataAccessSectionSettings.cs
+
+
+ Helper\MsSql.cs
+
+
+ Helper\PgSql.cs
+
+
-
-
diff --git a/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs b/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs
new file mode 100644
index 0000000..7ac7c99
--- /dev/null
+++ b/ADO.ExecuteCommand/Helper/CommandHelper.Factory.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections;
+using System.Configuration;
+
+namespace ADO.ExecuteCommand.Helper
+{
+ public abstract partial class CommandHelper
+ {
+ #region - Factory -
+
+ public static CommandHelper CreateHelper(string providerAlias)
+ {
+ try
+ {
+ var dict = ConfigurationManager.GetSection("daProviders") as IDictionary;
+ if (dict == null) throw new Exception("Null Reference in DataAccess Provider configuration Session.");
+
+ var providerConfig = dict[providerAlias] as ProviderAlias;
+ if (providerConfig == null) throw new Exception("Null Reference in Provider Alias configuration Session.");
+
+ return CreateHelper(new DataAccessSectionSettings(providerConfig.TypeName, providerConfig.ConnectionString));
+ }
+ catch (Exception e)
+ {
+ throw new Exception("If the section is not defined on the configuration file this method can't be used to create an AdoHelper instance.", e);
+ }
+ }
+
+ public static CommandHelper CreateHelper(DataAccessSectionSettings settings)
+ {
+ try
+ {
+ var providerType = settings.Type;
+
+ var daType = Type.GetType(providerType);
+ if (daType == null) throw new NullReferenceException("Null Reference in Provider type configuration Session.");
+
+ var provider = Activator.CreateInstance(daType, settings.ConnectionString);
+ if (provider is CommandHelper)
+ {
+ return provider as CommandHelper;
+ }
+
+ throw new Exception("The provider specified does not extends the QueryRunner abstract class.");
+ }
+ catch (Exception e)
+ {
+ throw new Exception("If the section is not defined on the configuration file this method can't be used to create an QueryRunner instance.", e);
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/ADO.ExecuteCommand/Helper/MySql.cs b/ADO.ExecuteCommand/Helper/MySql.cs
index bcadf9f..0fcd825 100644
--- a/ADO.ExecuteCommand/Helper/MySql.cs
+++ b/ADO.ExecuteCommand/Helper/MySql.cs
@@ -6,50 +6,19 @@ namespace ADO.ExecuteCommand.Helper
{
public sealed class MySql : CommandHelper
{
- public override IDbConnection GetConnection()
+ public MySql(string connectionString) : base(connectionString)
{
- if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString");
- return new MySqlConnection( ConnectionString );
}
- protected override IDbDataAdapter GetDataAdapter()
- {
- return new MySqlDataAdapter();
- }
-
- protected override void DeriveParameters(IDbCommand cmd)
+ public override IDbConnection GetConnection()
{
- if (!(cmd is MySqlCommand)) throw new ArgumentException("The command provided is not a MySqlCommand instance.", nameof(cmd));
- MySqlCommandBuilder.DeriveParameters((MySqlCommand)cmd);
+ if (string.IsNullOrEmpty(ConnectionString)) throw new NullReferenceException("ConnectionString");
+ return new MySqlConnection( ConnectionString );
}
protected override IDataParameter GetParameter()
{
return new MySqlParameter();
}
-
- protected override void ClearCommand(IDbCommand command)
- {
- var canClear = true;
- foreach(IDataParameter commandParameter in command.Parameters)
- {
- if (commandParameter.Direction != ParameterDirection.Input) canClear = false;
- }
-
- if (canClear)
- {
- command.Parameters.Clear();
- }
-
- command.Parameters.Clear();
- }
-
- protected override DataTable FillTable(IDbDataAdapter da)
- {
- var dt = new DataTable();
- ((MySqlDataAdapter) da).Fill(dt);
-
- return dt;
- }
}
}
\ No newline at end of file
diff --git a/ADO.ExecuteCommand/packages.config b/ADO.ExecuteCommand/packages.config
index 907e477..3f7fbbe 100644
--- a/ADO.ExecuteCommand/packages.config
+++ b/ADO.ExecuteCommand/packages.config
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg b/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg
new file mode 100644
index 0000000..2751ca9
Binary files /dev/null and b/NuGet/NET.Database.CommandLayer.1.0.0.0.nupkg differ
diff --git a/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg b/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg
new file mode 100644
index 0000000..157c706
Binary files /dev/null and b/NuGet/NET.Database.CommandLayer.2.0.0.1.nupkg differ
diff --git a/Thin.Database.CommandLayer.sln b/Thin.Database.CommandLayer.sln
index b526931..18e4c8d 100644
--- a/Thin.Database.CommandLayer.sln
+++ b/Thin.Database.CommandLayer.sln
@@ -7,6 +7,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ADO.ExecuteCommand", "ADO.E
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ADO.ExecuteCommand.Test", "ADO.ExecuteCommand.Test\ADO.ExecuteCommand.Test.csproj", "{CDCF391D-B31A-4A58-861D-199456E56368}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET Core", "NET Core", "{E4767CC8-7D5E-47F0-B190-9A5818B1B09A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NET Framework 4.5", "NET Framework 4.5", "{C24B7231-5233-49C9-8C84-D4FEFA90FDB3}"
+EndProject
+Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ADO.ExecuteCommand.Core", "ADO.ExecuteCommand.Core\ADO.ExecuteCommand.Core.xproj", "{B7737B4F-4C59-4CE5-AA62-0A6CCA639473}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,8 +27,17 @@ Global
{CDCF391D-B31A-4A58-861D-199456E56368}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CDCF391D-B31A-4A58-861D-199456E56368}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CDCF391D-B31A-4A58-861D-199456E56368}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B7737B4F-4C59-4CE5-AA62-0A6CCA639473}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {D6653B75-F3DC-4C5D-ADAA-B70F24D66A95} = {C24B7231-5233-49C9-8C84-D4FEFA90FDB3}
+ {CDCF391D-B31A-4A58-861D-199456E56368} = {C24B7231-5233-49C9-8C84-D4FEFA90FDB3}
+ {B7737B4F-4C59-4CE5-AA62-0A6CCA639473} = {E4767CC8-7D5E-47F0-B190-9A5818B1B09A}
+ EndGlobalSection
EndGlobal