Перечисление функций DLL?

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

С уважением и благодарностью, Хосе


person user361526    schedule 16.05.2009    source источник
comment
Вы говорите о неуправляемых или управляемых DLL?   -  person VVS    schedule 16.05.2009
comment
Я пытаюсь это программно во время выполнения, они могут быть неуправляемыми или управляемыми   -  person user361526    schedule 17.05.2009
comment
Я добавил редактирование в свой ответ, основываясь на том, что вам нужно загружать объекты во время выполнения.   -  person bendewey    schedule 17.05.2009


Ответы (4)


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

Изменить. Если вы пытаетесь прочитать типы и методы во время выполнения, вам следует использовать Reflection. Вам нужно будет загрузить файлы Assembly и GetExportedTypes. Затем перейдите от Members к Methods и Properties. Вот статья из MSDN, в которой есть пример перебора MemberInfo информация. Кроме того, вот статья журнала MSDN, Извлечение данных из сборок .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);
}
person bendewey    schedule 16.05.2009

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

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

person Nick Whaley    schedule 16.05.2009

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

person onedozenbagels    schedule 16.05.2009

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

пример:

c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll
person Cheeso    schedule 16.05.2009