枚举DLL函数?

时间:2009-05-16 19:11:52

标签: c# dll function enums dllimport

是否可以枚举DLL中存在的每个函数?如何获得签名? 我可以用C#做​​这个吗?或者我必须降低水平才能做到这一点?

问候和纠正, 何

4 个答案:

答案 0 :(得分:3)

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

编辑:如果您尝试在运行时阅读类型和方法,则需要使用Reflection。您必须加载AssemblyGetExportedTypes。然后,遍历MembersMethodsProperties。以下是来自MSDN的文章,其中有一个迭代MemberInfo信息的示例。另外,这是一篇MSDN杂志文章Extracting Data from .NET Assemblies

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

在此示例中,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);
}

答案 1 :(得分:2)

如果是托管dll:使用反射

如果它不受管理:您需要枚举DLL导出表

答案 2 :(得分:1)

您可以使用Dependency Walker查看dll中的所有导出,这是Microsoft的免费程序:http://en.wikipedia.org/wiki/Dependency_walker

答案 3 :(得分:1)

对于常规的win32 DLL,请参阅the Dumpbin utility。它包含在Visual-C ++中(包括我认为的免费“快递”版本)。

示例:

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