об экспорте методов функций из .net dll (C #) - PullRequest
0 голосов
/ 20 апреля 2011

math.dll

namespace math
{
    public class MyClass {
        public static int Add(int x, int y)
        {
            return x+y;
        }
    }

И в моем exe-проекте я хочу использовать функцию Add () так,

Пример 1 - Это работает

    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());
                } 
  }

Пример 2 - Это не работает

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());
                    } 
              }

Пример 3 - Это не работает

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());
}

Можете ли вы сказать мне, где ошибки неработающих примеров (2,3)? Спасибо.

1 Ответ

2 голосов
/ 20 апреля 2011

В примерах 2 и 3 вы используете Marshal.GetDelegateForFunctionPointer, который является функцией, используемой при работе с неуправляемым кодом для преобразования указателя неуправляемой функции в управляемый делегат.Сборка math содержит управляемый код .NET, поэтому вы должны использовать Reflection, как в примере 1. Поэтому не используйте эту функцию, если вы не пытаетесь повторно использовать функциональные возможности в неуправляемой библиотеке C, C ++, ....

Вы действительно должны различать неуправляемый (C, C ++, ...) и управляемый код (.NET).

...