0

我要构建一个 SOA gui 框架,我想从客户端模块自动检测服务和服务依赖项。到目前为止,我有这样的代码,它使用属性工作,放置在类模块上:

[ServiceProvider(typeof(DemoService3))]
[ServiceConsumer(typeof(DemoService1))]

我想知道如何自动扫描这些,这样人们就不会忘记添加标记并可能在运行时获得空引用。在代码中,服务通过以下命令注册和获取:

Services.RegisterService(new DemoService1());
Services.FetchService<DemoService3>();

我想找到这些调用,以及传入的类型(都采用类型参数,第一个是隐式的)......用于执行我的依赖项和构造的其余代码已经完成:)

4

3 回答 3

4

您需要在 CLR 级别而不是 C# 级别分析 IL 来解决这个问题。

您应该能够利用Mono Cecil来实现这一目标。

于 2009-02-08T16:32:17.327 回答
2

您可以使用 Mono.Cecil 或 .NET 反射来完成此操作。

推荐使用 Mono.Cecil,因为它具有更好的性能和灵活性。以下是一些可以帮助您入门的示例(Cecil + 顶部的简单扩展):

于 2009-02-08T16:43:02.860 回答
2

如果由于某种原因您无法使用 Mono.Cecil,您可以考虑手动解析 IL:您实际上只需要 findcallcallvirt指令,可能进行足够的静态分析以理解new DemoService1().

typeof(YourClass).GetMethod("YourMethod").GetMethodBody().GetILAsByteArray()是你的朋友。

于 2009-02-09T10:22:24.587 回答