Dynamic load .NET dll files (Creating a plug-in system) – C#
Finally I found some spare time to write an article on my (this) blog.
In the last days I needed to write a plug-in system for one of my projects. I managed to write it in C# and decided to share it on my blog. It’s really simple to create as you will see:
//This is a C# Console Application Project. The code was written with .NET Framework 2.0
using System;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
if (args.Length >= 1)
{
object[] s;
if (args.Length >= 2)
{
s = new object[args.Length – 1];
Array.Copy(args, 1, s, 0, args.Length – 1);
}
else
s = new object[] { };
Console.WriteLine(“Loading dll…”);
try{
Console.WriteLine(LoadDllMethod(“Namespace1.Class1”, “Method1”, args[0], s));
Console.WriteLine(“Dll method called!”);
}catch(Exception ex){Console.WriteLine(“Error:” + ex.ToString());}
}
Console.ReadLine();
}
static string LoadDllMethod(string title_class, string title_void, string path, object[] parameters)
{
Assembly u = Assembly.LoadFile(path);
Type t = u.GetType(title_class);
if (t != null)
{
MethodInfo m = t.GetMethod(title_void);
if (m != null)
{
if (parameters.Length >= 1)
{
object[] myparam = new object[1];
myparam[0] = parameters;
return (string)m.Invoke(null, myparam);
}
else
return (string)m.Invoke(null, null);
}
}
Exception ex = new Exception(“method/class not found”);
throw ex;
}
}
}
Off course you must change the code for specified type methods.
If you have 2 parameters for Method1 you must define the myparam Object as 2 length (object[] myparam=new myparams[2]), also you can get some exceptions if the Method1’s parameters are not objects so you must change myparam type.
Please take into account that the dll-s written in a .NET version major to the one the “invoker” was written in will not load.
Thanks m8. I really needed something like that 🙂
This article just tell how to load the specific method dynamically only, not for the whole DLL loading like general GAC. What I want is like DLL declaration in App.config.
Use DllImport for loading functions if you don’t want to use this method.
(using System.Runtime.InteropServices;)
Hi folks.
I have a NET dll, there is a fucntion that is not exported but i need to find a way to call it from my C# app or by another dll?
Is there a chance?
great work.. done
I really wonder if it wouldn’t work with LoadLibrary(..) from WIN32 API, by invoke them and write an wrapper around it in C#.
Why shouldn’t that work?
The strange thing i cant find it when i search on it.
Hi, thats greate!!!
But how to unload the DLL that is invoked?