funções Enumerando DLL?
Pergunta
É possível enumerar todas as funções presentes em uma DLL? Como sobre a obtenção de sua assinatura? Posso fazer isso em C #? Ou eu tenho que ir baixo nível para fazer isso?
Saudações e tks, Jose
Solução
Se é um .NET DLL de RedGate refletor pode listar o métodos e até mesmo tente desmontar o código. É um grande item de caixa de ferramentas de qualquer desenvolvedor e é grátis
Editar: Se você está tentando ler os tipos e métodos em tempo de execução que você vai querer usar a reflexão. Você teria que carregar o Assembly
e GetExportedTypes
. Em seguida, iterar sobre os Members
ao do Methods
e Properties
. Aqui está um artigo do MSDN que tem um exemplo de iteração sobre o MemberInfo
informações. Além disso, aqui está um artigo MSDN Magazine, extrair dados de .NET Assembléias .
Finalmente, aqui está um método de teste pequeno eu escrevi para a execução de um método em um objeto carregado.
Neste exemplo ClassLibrary1 tem uma classe de Class1:
public class Class1
{
public bool WasWorkDone { get; set; }
public void DoWork()
{
WasWorkDone = true;
}
}
E aqui está o teste:
[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);
}
Outras dicas
Se seu um gerenciado dll: Use reflexão
Se o seu não gerenciado: Você precisa enumerar tabela de DLL de exportação
Você pode ver todas as exportações de uma dll usando Dependency Walker, que é um programa gratuito da Microsoft: http://en.wikipedia.org/wiki/Dependency_walker
Para DLLs Win32 regulares, consulte o utilitário Dumpbin . Ele está incluído no Visual C ++ (incluindo o livre "expresso" versão que eu acredito).
exemplo:
c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll