Okan Kocyigit
Okan Kocyigit

Reputation: 13421

about exporting function methods from .net dll (C#)

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

Answers (1)

Darin Dimitrov
Darin Dimitrov

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

Related Questions