Перечислять функции DLL? - PullRequest
2 голосов
/ 16 мая 2009

Можно ли перечислить каждую функцию, присутствующую в DLL? Как насчет получения своей подписи? Могу ли я сделать это в C #? Или я должен идти на низкий уровень, чтобы сделать это?

С уважением и ткс, Хосе

Ответы [ 4 ]

3 голосов
/ 16 мая 2009

Если это .NET DLL Отражатель RedGate может перечислять методы и даже пытаться разобрать код. Это отличный элемент для любого инструментария разработчика, и он бесплатный

Редактировать: Если вы пытаетесь читать типы и методы во время выполнения, вам нужно использовать Reflection. Вы должны загрузить Assembly и GetExportedTypes. Затем выполните итерации по Members до Methods и Properties. Вот статья из MSDN, в которой приведен пример перебора информации MemberInfo. Кроме того, вот статья в журнале MSDN Magazine, Извлечение данных из сборок .NET .

Наконец, вот небольшой тестовый метод, который я написал для выполнения метода на загруженном объекте.

В этом примере 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);
}
2 голосов
/ 16 мая 2009

Если это управляемая DLL: используйте отражение

Если это неуправляемо: вам нужно перечислить таблицу экспорта DLL

1 голос
/ 16 мая 2009

Для обычных библиотек win32 см. утилиту Dumpbin . Он включен в Visual-C ++ (включая бесплатную «экспресс-версию», я верю).

пример:

c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll
1 голос
/ 16 мая 2009

Вы можете увидеть все экспорты в dll с помощью Dependency Walker, бесплатной программы от Microsoft: http://en.wikipedia.org/wiki/Dependency_walker

...