Можно ли перечислить все функции, присутствующие в DLL? Как насчет того, чтобы получить его подпись? Могу ли я сделать это на С#? Или мне нужно перейти на низкий уровень, чтобы сделать это?
С уважением и благодарностью, Хосе
Можно ли перечислить все функции, присутствующие в DLL? Как насчет того, чтобы получить его подпись? Могу ли я сделать это на С#? Или мне нужно перейти на низкий уровень, чтобы сделать это?
С уважением и благодарностью, Хосе
Если это .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);
}
Если это управляемая dll: используйте отражение
Если он неуправляемый: вам нужно перечислить таблицу экспорта DLL.
Вы можете увидеть все экспорты в dll с помощью Dependency Walker, бесплатной программы от Microsoft: http://en.wikipedia.org/wiki/Dependency_walker
Обычные библиотеки DLL win32 см. в утилите Dumpbin. Он включен в Visual-C++ (включая бесплатную «экспресс-версию», я полагаю).
пример:
c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll