关于从.net dll(C#)导出功能方法的信息

|| 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)吗? 谢谢。     
已邀请:
在示例2和3中,您使用的是
Marshal.GetDelegateForFunctionPointer
,该函数在处理非托管代码时使用,以便将非托管函数指针转换为托管委托。 “ 5”程序集包含托管的.NET代码,因此您应该像示例1一样使用Reflection。因此,除非尝试在非托管的C,C ++,...库中重用功能,否则不要使用此函数。 您确实应该在非托管(C,C ++等)和托管代码(.NET)之间进行区分。     

要回复问题请先登录注册