81 lines
3.0 KiB
C#

// See https://aka.ms/new-console-template for more information
using System.Reflection;
namespace dopt.TOM.Integration
{
internal class Program
{
static internal bool atRuntime = true;
static void Main(string[] args)
{
string id = "345";
string filename = "Dummy_Dataset_N_1000.csv";
int idx = 0;
int? idxID, idxDyn;
idxID = null; idxDyn = null;
foreach (string arg in args)
{
// ID
if (arg == "-id") idxID = idx + 1;
if (idxID != null && idxID == idx) id = arg;
// dynamic loading
if (arg == "-dyn") idxDyn = idx + 1;
if (idxDyn != null && idxDyn == idx) atRuntime = Convert.ToBoolean(arg);
idx++;
}
if (atRuntime) dynamicBind(id, filename);
else directBind(id, filename);
Console.WriteLine("-----------------------------------------------------");
var key = Console.ReadLine();
Console.WriteLine(key);
}
static void directBind(string id, string filename)
{
Console.WriteLine("Test for static binding at buildtime...");
var plugin = new Plugin("");
Console.WriteLine("First invocation...");
plugin.RunOnCSV(id, filename);
//Console.WriteLine("Second invocation...");
//plugin.RunOnCSV(id, filename);
}
static void dynamicBind(string id, string filename)
{
Console.WriteLine("Test for dynamic loading at runtime...");
// correct DLL path
string relPathToDll = @".\dopt.TOM.dll";
Type currentType = typeof(Program);
Assembly assemblySelf = currentType.Assembly;
Console.WriteLine($"Location:\n{assemblySelf.Location}");
string assemPath = assemblySelf.Location;
if (assemPath.StartsWith("file:///"))
{
assemPath = assemPath.Replace("file:///", "");
}
string exeDir = System.IO.Path.GetDirectoryName(assemPath);
string pathToDll = Path.Combine(exeDir, relPathToDll);
// load type and execute method
Assembly pluginDll = Assembly.LoadFrom(pathToDll);
Type Plugin = pluginDll.GetType("dopt.TOM.Plugin");
object instance = Activator.CreateInstance(Plugin, "");
MethodInfo[] methods = Plugin.GetMethods();
Console.WriteLine("Available methods are:");
foreach (MethodInfo method in methods)
{
Console.WriteLine(method.Name);
}
Console.WriteLine($"Trying to invoke: {methods[0]}");
object[] parameters = { id, filename };
Console.WriteLine("First invocation...");
methods[0].Invoke(instance, parameters);
//Console.WriteLine("Second invocation...");
//methods[0].Invoke(instance, parameters);
}
}
}