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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top