Merge branch 'master' into task/2

This commit is contained in:
ChronosX88 2020-09-21 22:18:53 +04:00
commit fe462614a3
Signed by: ChronosXYZ
GPG Key ID: 085A69A82C8C511A
8 changed files with 175 additions and 7 deletions

View File

@ -77,7 +77,7 @@ namespace Zirconium.Core.Logging
break; break;
} }
case LogType.Debug: { case LogType.Debug: {
tagFormatter = new Formatter("DEBUG", Color.Lime); tagFormatter = new Formatter("DEBUG", Color.LightGray);
break; break;
} }
default: { default: {

View File

@ -1,3 +1,5 @@
using System;
namespace Zirconium.Core.Plugins.Interfaces namespace Zirconium.Core.Plugins.Interfaces
{ {
public interface IPluginAPI public interface IPluginAPI
@ -6,5 +8,6 @@ namespace Zirconium.Core.Plugins.Interfaces
void PreInitialize(IPluginManager pluginManager); void PreInitialize(IPluginManager pluginManager);
string GetPluginUniqueName(); string GetPluginUniqueName();
dynamic GetExportedAPI(); dynamic GetExportedAPI();
Type[] GetExportedTypes();
} }
} }

View File

@ -2,8 +2,10 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.Loader;
using System.Threading; using System.Threading;
using McMaster.NETCore.Plugins; using McMaster.NETCore.Plugins;
using Zirconium.Core.Logging;
using Zirconium.Core.Models; using Zirconium.Core.Models;
using Zirconium.Core.Plugins.Interfaces; using Zirconium.Core.Plugins.Interfaces;
using Zirconium.Utils; using Zirconium.Utils;
@ -54,7 +56,7 @@ namespace Zirconium.Core.Plugins
public IPluginAPI LoadPlugin(string pluginName) public IPluginAPI LoadPlugin(string pluginName)
{ {
PluginLoader loader; PluginLoader loader;
var pluginDll = Path.Combine(_currentPluginFolderPath, pluginName + ".dll"); var pluginDll = Path.Combine(_currentPluginFolderPath, pluginName, pluginName + ".dll");
if (File.Exists(pluginDll)) if (File.Exists(pluginDll))
{ {
Logging.Log.Debug("Found plugin " + pluginName); Logging.Log.Debug("Found plugin " + pluginName);
@ -62,6 +64,7 @@ namespace Zirconium.Core.Plugins
loader = PluginLoader.CreateFromAssemblyFile( loader = PluginLoader.CreateFromAssemblyFile(
pluginDll, pluginDll,
sharedTypes: new[] { sharedTypes: new[] {
typeof(Log),
typeof(IPluginAPI), typeof(IPluginAPI),
typeof(IPluginHostAPI), typeof(IPluginHostAPI),
typeof(IPluginManager), typeof(IPluginManager),
@ -71,7 +74,8 @@ namespace Zirconium.Core.Plugins
typeof(ICoreEventHandler), typeof(ICoreEventHandler),
typeof(BaseMessage), typeof(BaseMessage),
typeof(CoreEvent) typeof(CoreEvent)
} },
config => config.PreferSharedTypes = true
); );
} }
else else
@ -79,15 +83,24 @@ namespace Zirconium.Core.Plugins
throw new Exception("specified plugin is not found"); throw new Exception("specified plugin is not found");
} }
var pluginTypes = loader.LoadDefaultAssembly().GetTypes();
IPluginAPI plugin = null; IPluginAPI plugin = null;
foreach (var pluginType in loader foreach (var pluginType in pluginTypes
.LoadDefaultAssembly()
.GetTypes()
.Where(t => typeof(IPluginAPI).IsAssignableFrom(t) && !t.IsAbstract)) .Where(t => typeof(IPluginAPI).IsAssignableFrom(t) && !t.IsAbstract))
{ {
// This assumes the implementation of IPlugin has a parameterless constructor // This assumes the implementation of IPlugin has a parameterless constructor
plugin = (IPluginAPI)Activator.CreateInstance(pluginType); plugin = (IPluginAPI)Activator.CreateInstance(pluginType);
Logging.Log.Debug($"Created plugin instance '{plugin.GetPluginUniqueName()}'."); Logging.Log.Debug($"Created plugin instance '{plugin.GetPluginUniqueName()}'.");
var exportedTypes = plugin.GetExportedTypes();
if (exportedTypes != null)
{
foreach (var type in exportedTypes)
{
var path = new Uri(type.Module.Assembly.CodeBase).LocalPath;
AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
}
}
plugin.PreInitialize(this); plugin.PreInitialize(this);
plugin.Initialize(_pluginHostAPI); plugin.Initialize(_pluginHostAPI);
} }

View File

@ -1,4 +1,5 @@
using Newtonsoft.Json; using System;
using Newtonsoft.Json;
using Zirconium.Core.Logging; using Zirconium.Core.Logging;
using Zirconium.Core.Models; using Zirconium.Core.Models;
using Zirconium.Core.Plugins.Interfaces; using Zirconium.Core.Plugins.Interfaces;
@ -19,6 +20,11 @@ namespace HelloWorldPlugin
public void PreInitialize(IPluginManager pluginManager) { } public void PreInitialize(IPluginManager pluginManager) { }
public dynamic GetExportedAPI() { return null; } public dynamic GetExportedAPI() { return null; }
public Type[] GetExportedTypes()
{
return null;
}
} }
internal class C2SHandler : IC2SMessageHandler internal class C2SHandler : IC2SMessageHandler

View File

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../Zirconium/Zirconium.csproj">
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<PackageReference Include="MongoDB.Bson" Version="2.10.4" />
<PackageReference Include="MongoDB.Driver" Version="2.10.4" />
<PackageReference Include="MongoDB.Driver.Core" Version="2.10.4" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,58 @@
using System.Collections.Immutable;
using System.Collections.Generic;
using Zirconium.Core.Plugins.Interfaces;
using MongoDB.Driver;
using Zirconium.Core.Logging;
namespace MongoDBPlugin
{
class Plugin : IPluginAPI
{
private IMongoDatabase _database;
public dynamic GetExportedAPI()
{
return _database;
}
public System.Type[] GetExportedTypes()
{
// var mongoCore = Assembly.Load("MongoDB.Driver.Core");
// var mongoBson = Assembly.Load("MongoDB.Bson");
return new System.Type[] {typeof(IMongoDatabase)};
}
public string GetPluginUniqueName()
{
return "MongoDB";
}
public void Initialize(IPluginHostAPI pluginHostAPI)
{
var settingsDynamic = pluginHostAPI.GetSettings(this);
var settings = (IImmutableDictionary<string, dynamic>) ((IDictionary<string, object>)settingsDynamic).ToImmutableDictionary();
var host = (string) settings.GetValueOrDefault("Host");
var port = (int) settings.GetValueOrDefault("Port");
var user = (string) settings.GetValueOrDefault("User");
var password = (string) settings.GetValueOrDefault("Password");
var database = (string) settings.GetValueOrDefault("Database");
MongoClient client;
if (user == null && password == null)
{
client = new MongoClient($"mongodb://{host}:{port}");
}
else
{
client = new MongoClient($"mongodb://{user}:{password}@{host}:{port}");
}
var db = client.GetDatabase(database);
Log.Info("MongoDB is connected");
_database = db;
}
public void PreInitialize(IPluginManager pluginManager) { }
}
}

View File

@ -0,0 +1,57 @@
using Zirconium.Core.Plugins.Interfaces;
using MongoDB.Driver;
using Zirconium.Core.Logging;
using System;
namespace TestMongoDB
{
class Plugin : IPluginAPI
{
private IMongoDatabase _database;
public dynamic GetExportedAPI()
{
return null;
}
public Type[] GetExportedTypes()
{
return null;
}
public string GetPluginUniqueName()
{
return "TestMongoDB";
}
public void Initialize(IPluginHostAPI pluginHostAPI)
{
var tm = new TestModel();
tm.ABC = "qweqowie";
_database.GetCollection<TestModel>("test_model").InsertOne(tm);
}
public void PreInitialize(IPluginManager pluginManager)
{
var db = pluginManager.Depends(this, "MongoDB");
var receivedType = db.GetType();
Log.Debug(db.GetType().FullName);
Log.Debug(db.GetType().AssemblyQualifiedName);
foreach (Type i in db.GetType().GetInterfaces()) {
Log.Debug("DB object interface: " + i.AssemblyQualifiedName);
}
Log.Debug("Type info in current assembly context:");
var mongoDBType = typeof(IMongoDatabase);
Log.Debug(mongoDBType.FullName);
Log.Debug(mongoDBType.AssemblyQualifiedName);
Log.Debug(new Uri(mongoDBType.Module.Assembly.CodeBase).LocalPath);
Log.Debug($"Casting compatibility: {mongoDBType.IsAssignableFrom(db.GetType())}");
_database = (IMongoDatabase) db;
}
}
class TestModel
{
public string ABC { get; set; }
}
}

View File

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../Zirconium/Zirconium.csproj">
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<ProjectReference Include="../MongoDB/MongoDB.csproj"/>
</ItemGroup>
</Project>