Dynamically load an assembly and invoke a method

M

Martin Maat

Hi,

I am trying to create a plug-in assembly without the need to register it in
the GAC. Reflection should help me out here. I got this far:

private void button1_Click(object sender, System.EventArgs e)
{
Assembly engine = null;
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = assemblyPath + @"Engine.dll";
engine = Assembly.Load(assemblyName);
Type[] types = engine.GetTypes();
foreach (Type type in types)
{
if ((type.FullName == "Engine.Responder") & (type.IsClass))
{
ConstructorInfo ci = type.GetConstructor(Type.EmptyTypes);
object responder = ci.Invoke(null);
MethodInfo mi = type.GetMethod("ReplyToMessage");
object[] parameters = new object[2];
string msg = "Pipo de Clown";
string reply = null;
parameters[0] = msg;
parameters[1] = reply;
string returnValue = (string)mi.Invoke(responder, parameters);
txtMonitor.AppendText("reply = " + reply);
}
}
}

This is the loaded assembly's method I invoke:

public string ReplyToMessage(string msg, out string reply)
{
reply = "This is my reply.";
return reply;
}


I am doing something right because I do get all the types in the external
assembly and passing either 1 or 3 parameters throws an exception telling me
the number of parameters is wrong. With a parameter array of two strings
passed in it "succeeds" but the external method's code is never visited.
What is wrong?

Martin.
 
P

Philip Rieck

What happens when you use this instead:
string returnValue = (string)mi.Invoke(responder, BindingFlags.InvokeMethod,
null, parameters);

?
 
E

Eric Gunnerson [MS]

Martin,

I think you should be using Activator.CreateInstance() rather than invoking
to the constructor.

--
Eric Gunnerson

Visit the C# product team at http://www.csharp.net
Eric's blog is at http://weblogs.asp.net/ericgu/

This posting is provided "AS IS" with no warranties, and confers no rights.
Philip Rieck said:
What happens when you use this instead:
string returnValue = (string)mi.Invoke(responder, BindingFlags.InvokeMethod,
null, parameters);

?

Martin Maat said:
Hi,

I am trying to create a plug-in assembly without the need to register it in
the GAC. Reflection should help me out here. I got this far:

private void button1_Click(object sender, System.EventArgs e)
{
Assembly engine = null;
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = assemblyPath + @"Engine.dll";
engine = Assembly.Load(assemblyName);
Type[] types = engine.GetTypes();
foreach (Type type in types)
{
if ((type.FullName == "Engine.Responder") & (type.IsClass))
{
ConstructorInfo ci = type.GetConstructor(Type.EmptyTypes);
object responder = ci.Invoke(null);
MethodInfo mi = type.GetMethod("ReplyToMessage");
object[] parameters = new object[2];
string msg = "Pipo de Clown";
string reply = null;
parameters[0] = msg;
parameters[1] = reply;
string returnValue = (string)mi.Invoke(responder, parameters);
txtMonitor.AppendText("reply = " + reply);
}
}
}

This is the loaded assembly's method I invoke:

public string ReplyToMessage(string msg, out string reply)
{
reply = "This is my reply.";
return reply;
}


I am doing something right because I do get all the types in the external
assembly and passing either 1 or 3 parameters throws an exception
telling
me
the number of parameters is wrong. With a parameter array of two strings
passed in it "succeeds" but the external method's code is never visited.
What is wrong?

Martin.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top