【问题标题】:about exporting function methods from .net dll (C#)关于从 .net dll (C#) 导出函数方法
【发布时间】:2011-04-19 21:33:20
【问题描述】:

ma​​th.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)的错误在哪里吗? 谢谢。

【问题讨论】:

  • 您是否想了解程序集和方法的机制?或者您只是想在外部程序集中使用一种方法?如果是后者,只需将程序集引用添加到您的项目并直接实例化该类。您不需要编写任何这些代码。
  • 是的,我知道这是添加参考的最简单方法。正如你所说,我想了解程序集和导出方法。感谢您的建议。

标签: c# dll dllexport loadlibrary getprocaddress


【解决方案1】:

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

您确实应该区分非托管(C、C++、...)和托管代码 (.NET)。

【讨论】:

  • 又是你,谢谢。所以我知道我不能用非托管代码创建相同的函数,可以吗?
  • @ocanal,您的 math.dll 是一个 .NET 程序集 => 托管代码。不是非托管 C/C++ 代码。如果您想创建非托管代码并使用 Marshal.GetDelegateForFunctionPointer,那么继续开始编写 C++,而不是 C#。
猜你喜欢
  • 2012-09-06
  • 2011-08-25
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多