C# 枚举DLL函数?

C# 枚举DLL函数?,c#,dll,function,enums,dllimport,C#,Dll,Function,Enums,Dllimport,是否可以枚举DLL中存在的每个函数?得到它的签名怎么样? 我能用C#做这个吗?或者我必须去低水平做这件事 问候和tks, Jose如果是.NET DLL,则可以列出方法,甚至尝试反汇编代码。对于任何开发人员的工具箱来说,这都是一个很棒的项目,而且是免费的 编辑:如果试图在运行时读取类型和方法,则需要使用反射。您必须加载程序集和GetExportedTypes。然后,迭代成员到方法和属性。下面是一篇来自MSDN的文章,其中有一个迭代信息的示例。另外,这里有一篇MSDN杂志文章 最后,这里是我为在加

是否可以枚举DLL中存在的每个函数?得到它的签名怎么样? 我能用C#做这个吗?或者我必须去低水平做这件事

问候和tks, Jose

如果是.NET DLL,则可以列出方法,甚至尝试反汇编代码。对于任何开发人员的工具箱来说,这都是一个很棒的项目,而且是免费的

编辑:如果试图在运行时读取类型和方法,则需要使用反射。您必须加载
程序集
GetExportedTypes
。然后,迭代
成员
方法
属性
。下面是一篇来自MSDN的文章,其中有一个迭代信息的示例。另外,这里有一篇MSDN杂志文章

最后,这里是我为在加载对象上执行方法而编写的一个小测试方法

在此示例中,ClassLibrary1有一个Class1类:

public class Class1
{
    public bool WasWorkDone { get; set; }

    public void DoWork()
    {
        WasWorkDone = true;
    }
}
下面是测试:

[TestMethod]
public void CanExecute_On_LoadedClass1()
{
    // Load Assembly and Types
    var assm = Assembly.LoadFile(@"C:\Lib\ClassLibrary1.dll");
    var types = assm.GetExportedTypes();

    // Get object type informaiton
    var class1 = types.FirstOrDefault(t => t.Name == "Class1");
    Assert.IsNotNull(class1);

    var wasWorkDone = class1.GetProperty("WasWorkDone");
    Assert.IsNotNull(wasWorkDone);

    var doWork = class1.GetMethod("DoWork");
    Assert.IsNotNull(doWork);

    // Create Object
    var class1Instance = Activator.CreateInstance(class1.UnderlyingSystemType);

    // Do Work
    bool wasDoneBeforeInvoking = 
          (bool)wasWorkDone.GetValue(class1Instance, null);
    doWork.Invoke(class1Instance, null);
    bool wasDoneAfterInvoking = 
          (bool)wasWorkDone.GetValue(class1Instance, null);

    // Assert
    Assert.IsFalse(wasDoneBeforeInvoking);
    Assert.IsTrue(wasDoneAfterInvoking);
}

您可以使用Dependency Walker查看dll中的所有导出,这是Microsoft提供的免费程序:

对于常规win32 dll,请参阅。它包含在Visual C++中(我相信包括免费的“express”版本)

例如:

c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll

如果是托管dll:使用反射


如果是非托管的:您需要枚举DLL导出表

您是在谈论非托管的DLL还是托管的DLL?我正在尝试在运行时对其进行编程,它们可以是非托管的或托管的。根据您在运行时需要加载对象的情况,我在回答中添加了一个编辑。