关于从.net dll(C#)导出函数方法

本文关键字:函数 方法 net dll | 更新日期: 2023-09-27 17:50:31

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(的错误在哪里吗?谢谢

关于从.net dll(C#)导出函数方法

在示例2和示例3中,您使用Marshal.GetDelegateForFunctionPointer,这是一个在处理非托管代码时使用的函数,用于将非托管函数指针转换为托管委托。math程序集包含托管.NET代码,因此应该像示例1中那样使用反射。因此,除非您试图重用非托管C、C++、…中的功能,否则不要使用此函数。。。图书馆

你真的应该区分非托管代码(C,C++,…(和托管代码(.NET(