I want to load an assembly (its name is stored in a string), use reflection to check if it has a method called "CustomType MyMethod(byte[] a, int b)" and call it or throw an exception otherwise. I guess I should do something like this, but would appreciate if someone could offer same advice on how best to do it:
Assembly asm = Assembly.Load("myAssembly"); /* 1. does it matter if write myAssembly or myAssembly.dll? */
Type t = asm.GetType("myAssembly.ClassName");
// specify parameters
byte[] a = GetParamA();
int b = GetParamB();
object[] params = new object[2];
params[0] = a;
params[1] = b;
/* 2. invoke method MyMethod() which returns object "CustomType" - how do I check if it exists? */
/* 3. what's the meaning of 4th parameter (t in this case); MSDN says this is "the Object on which to invoke the specified member", but isn't this already accounted for by using t.InvokeMember()? */
CustomType result = t.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, t, params);
Is this good enough, or are there better/faster/shorter ways? What about constructors, given that these methods are not static - can they simply be ignored?
When invoking void Methods(), is it ok to just write t.InvokeMember(...) or should you always do Object obj = t.InvokeMember(...)?
Thanks in advance.
EDIT I have provided a working example as a separate answer below.
You can use dynamic type whose will be resolved in runtime.
Your current code isn't fulfilling that requirement. But you can pretty easily with something like this:
As far as I'm concerned this is the best way and there isn't really anything faster per say.
You are still going to have to create an instance of
t
as shown in my example. This will use the default constructor with no arguments. If you need to pass arguments you can, just see the MSDN documentation and modify it as such.Since this seems to be a popular question, here's the complete source code example on how to do it.
Suppose we have a sample assembly, MyAssembly.dll, with a class MyClass. We wish to dynamically load it and invoke its methods. MyAssembly code:
First, we would like to create an instance of the class using the constructor
MyClass(int initialX, int initialY)
, then call the methodpublic int MyMethod(int count, string text)
. Here's how you do it from another project (e.g. a console application):Calling the static method
public static void StaticMethod(int count, float radius)
looks like this: