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

关于从.net dll(C#)导出函数方法,c#,dll,dllexport,loadlibrary,getprocaddress,C#,Dll,Dllexport,Loadlibrary,Getprocaddress,math.dll namespace math { public class MyClass { public static int Add(int x, int y) { return x+y; } } 在我的exe项目中,我想使用Add()函数 示例1-这是可行的 示例2-这不起作用 示例3-这不起作用 你能告诉我不起作用的例子(2,3)的错误在哪里吗? 谢谢。在示例2和3中,您使用的是,这是处理非托管

math.dll

namespace math
{
    public class MyClass {
        public static int Add(int x, int y)
        {
            return x+y;
        }
    }
在我的exe项目中,我想使用Add()函数

示例1-这是可行的

示例2-这不起作用

示例3-这不起作用

你能告诉我不起作用的例子(2,3)的错误在哪里吗?
谢谢。

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


<>你确实应该区分非托管(C,C++,…)和托管代码(.NET)。< /P> AHH达林再次感谢,谢谢。所以我明白我不能用非托管代码创建相同的函数,对吗?@ocanal,您的math.dll是一个.NET程序集=>托管代码。不是非托管C/C++代码。如果您想创建非托管代码并使用MalSal.GETEnraveToFrutoBooType,那么继续写C++,而不是C语言。您是否试图理解程序集和方法的机制?或者您只是试图在外部程序集中使用方法?如果是后者,只需向项目添加程序集引用并直接实例化该类即可。您不需要编写任何代码。是的,我知道这是添加引用的最简单方法。正如您所说,我想了解程序集和导出方法。谢谢您的建议。
    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());
                } 
  }
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());
                    } 
              }
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());
}