是否可以枚举DLL中存在的每个函数?如何获得签名? 我可以用C#做这个吗?或者我必须降低水平才能做到这一点?
问候和纠正, 何
答案 0 :(得分: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 :(得分:2)
如果是托管dll:使用反射
如果它不受管理:您需要枚举DLL导出表
答案 2 :(得分:1)
您可以使用Dependency Walker查看dll中的所有导出,这是Microsoft的免费程序:http://en.wikipedia.org/wiki/Dependency_walker
答案 3 :(得分:1)
对于常规的win32 DLL,请参阅the Dumpbin utility。它包含在Visual-C ++中(包括我认为的免费“快递”版本)。
示例:
c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll