2009-05-16 3 views
2

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

С уважением и ТКС, Хосе

+2

Вы говорите о unmananged или управляемых библиотек DLL? – VVS

+2

во время выполнения или времени разработки? –

+0

Я пытаюсь это программировать во время выполнения, они могут быть неуправляемыми или управляемыми – user361526

ответ

3

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

Редактировать: Если вы пытаетесь прочитать типы и методы во время выполнения, вы захотите использовать Reflection. Вам нужно будет загрузить Assembly и GetExportedTypes. Затем, итерации по Members на Methods и Properties. Вот статья из 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

Спасибо! но как я могу сделать это с помощью родных DLL (неуправляемых)? – user361526

1

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

пример:

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

Если его удалось длл: Использование отражения

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

Смежные вопросы