我要构建一个SOA gui框架,我想从客户端模块自动检测服务和服务依赖。到目前为止,我有这样的代码,它使用属性,放在类模块上:
[ServiceProvider(typeof(DemoService3))]
[ServiceConsumer(typeof(DemoService1))]
我想知道如何自动扫描这些内容,以便人们不会忘记添加标记并可能在运行时获取空引用。在代码中,通过以下命令注册和获取服务:
Services.RegisterService(new DemoService1());
Services.FetchService<DemoService3>();
我想找到这些调用,以及传入的类型(两者都采用类型参数,对第一个进行隐式)...用于执行依赖项和构造的其余代码已经完成:)< / p>
答案 0 :(得分:4)
您需要在CLR级别而不是C#级别分析IL来解决这个问题。
您应该可以利用Mono Cecil来解决此问题。
答案 1 :(得分:2)
您可以使用Mono.Cecil或.NET反射来实现这一目标。
建议使用Mono.Cecil,因为它具有更好的性能和灵活性。以下是一些可以帮助您入门的示例(Cecil +简单扩展):答案 2 :(得分:2)
如果由于某种原因你无法使用Mono.Cecil,你可以考虑手动解析IL:你实际上只需要找到call
和callvirt
指令,可能是静态的分析足以理解new DemoService1()
返回的类型。
typeof(YourClass).GetMethod("YourMethod").GetMethodBody().GetILAsByteArray()
是你的朋友。