Reputation: 13421
math.dll
namespace math
{
public class MyClass {
public static int Add(int x, int y)
{
return x+y;
}
}
And in my exe project I want to use Add() function so,
Example 1 - This is working
public void Example_1()
{
SampleAssembly = Assembly.Load("math");
Type type = SampleAssembly.GetType("math.MyClass");
MethodInfo methodInfo = type.GetMethod("Add");
if(methodInfo != null)
{
object result = null;
ParameterInfo[] parameters = methodInfo.GetParameters();
object classInstance = Activator.CreateInstance(type, null);
object[] parametersArray = new object[] { 3, 5 };
result = methodInfo.Invoke(classInstance, parametersArray);
MessageBox.Show(result.ToString());
}
}
Example 2 - This is not working
public delegate int Add(int x,int y);
public void Example_2()
{
SampleAssembly = Assembly.Load("math");
Type type = SampleAssembly.GetType("math.MyClass");
MethodInfo methodInfo = type.GetMethod("Add");
if(methodInfo != null)
{
Add add = (Add)Marshal.GetDelegateForFunctionPointer
(methodInfo.MethodHandle.GetFunctionPointer(),typeof(Add));
MessageBox.Show(add(3,2).ToString());
}
}
Example 3 - This is not working
public void Example_3() {
IntPtr hdl = LoadLibrary("math.dll");
IntPtr addr = GetProcAddress(hdl,"MyClass");
IntPtr myfunction = GetProcAddress(addr,"Add");
Add add= (Add)Marshal.GetDelegateForFunctionPointer(hdl,typeof(Add));
MessageBox.Show(add(2,3).ToString());
}
Can you tell me where is the mistakes of not working examples(2,3)? Thanks.
Upvotes: 0
Views: 803
Reputation: 1038780
In example 2 and 3 you are using the Marshal.GetDelegateForFunctionPointer
which is a function used when working with unmanaged code in order to convert an unmanaged function pointer to a managed delegate. The math
assembly contains managed .NET code so you should use Reflection as in Example 1. So don't use this function unless you are trying to reuse functionality in an unmanaged C, C++, ... library.
You really should make the distinction between unmanaged (C, C++, ...) and managed code (.NET).
Upvotes: 2