作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以枚举 DLL 中存在的每个函数?得到它的签名怎么样?我可以在 C# 中执行此操作吗?还是我必须降低级别才能执行此操作?
问候和感谢,何塞
最佳答案
如果是 .NET DLL RedGate's Reflector可以列出方法,甚至可以尝试反汇编代码。对于任何开发人员的工具箱来说,它都是一个很棒的项目,而且是免费的
编辑:如果您尝试在运行时读取类型和方法,您需要使用反射。您必须加载 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);
}
关于c# - 枚举 DLL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873078/
我是一名优秀的程序员,十分优秀!