C# 枚举DLL函数?
是否可以枚举DLL中存在的每个函数?得到它的签名怎么样? 我能用C#做这个吗?或者我必须去低水平做这件事 问候和tks, Jose如果是.NET DLL,则可以列出方法,甚至尝试反汇编代码。对于任何开发人员的工具箱来说,这都是一个很棒的项目,而且是免费的 编辑:如果试图在运行时读取类型和方法,则需要使用反射。您必须加载C# 枚举DLL函数?,c#,dll,function,enums,dllimport,C#,Dll,Function,Enums,Dllimport,是否可以枚举DLL中存在的每个函数?得到它的签名怎么样? 我能用C#做这个吗?或者我必须去低水平做这件事 问候和tks, Jose如果是.NET DLL,则可以列出方法,甚至尝试反汇编代码。对于任何开发人员的工具箱来说,这都是一个很棒的项目,而且是免费的 编辑:如果试图在运行时读取类型和方法,则需要使用反射。您必须加载程序集和GetExportedTypes。然后,迭代成员到方法和属性。下面是一篇来自MSDN的文章,其中有一个迭代信息的示例。另外,这里有一篇MSDN杂志文章 最后,这里是我为在加
程序集
和GetExportedTypes
。然后,迭代成员
到方法
和属性
。下面是一篇来自MSDN的文章,其中有一个迭代信息的示例。另外,这里有一篇MSDN杂志文章
最后,这里是我为在加载对象上执行方法而编写的一个小测试方法
在此示例中,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);
}
您可以使用Dependency Walker查看dll中的所有导出,这是Microsoft提供的免费程序:对于常规win32 dll,请参阅。它包含在Visual C++中(我相信包括免费的“express”版本) 例如:
c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll
如果是托管dll:使用反射
如果是非托管的:您需要枚举DLL导出表您是在谈论非托管的DLL还是托管的DLL?我正在尝试在运行时对其进行编程,它们可以是非托管的或托管的。根据您在运行时需要加载对象的情况,我在回答中添加了一个编辑。