方法执行如何在C#中工作?

时间:2012-10-18 16:50:35

标签: c#-4.0

在C#中,当应用程序A使用(IAppB)Activator.CreateInstance(Type.GetTypeFromProgID('AppB')).CallMe()之类的应用程序句柄调用应用程序B时,应用程序A如何将调用发送到应用程序B?我不是要求硬件层解释,我试图弄清楚是否有可能以某种方式捕获对应用程序的方法调用以便弄乱它们。

2 个答案:

答案 0 :(得分:1)

根据用法和名称,您很可能正在对进程外COM服务器进行方法调用。它的机制可以填写一本书(很多已经写过),所以只是一个简短的概述。

通过使用存储在注册表中的配置信息启动COM服务器,球开始滚动。底层的本机api调用是CoCreateInstance()。然后,COM基础结构再次使用注册表来发现充当代理和存根的DLL。代理的工作是模拟您正在使用的确切COM接口。在这种情况下,coclass的默认接口,即声明CallMe()方法的接口。

代理序列化传递的参数(如果有),然后调用RPC以向服务器发出调用请求。在服务器端,存根充当客户端代码。它反序列化参数并进行实际调用。调用结果,至少HRESULT,以及可能通过引用传递并需要复制的任何参数,然后返回代理完成调用。

在低级RPC边界处弄乱此方案是不切实际的。但是,您可以在技术上创建自己的代理和存根。存在重大障碍,它们通常是由MIDL工具用IDL语言编写的界面描述自动生成的。至少,你需要那个IDL,这样你才能准确地知道界面是什么样的。这往往很困难,因为你很少拥有服务器的源代码,所以也没有IDL。如果服务器有类型库,您可以反编译类型库。这是不太可能的,因为你正在进行一个迟到的电话。最后但并非最不重要的,你需要很好地了解RPC。很困难,这很模糊。

答案 1 :(得分:0)

你在这里混合了很多东西

  • 应用程序A调用应用程序B - 这通常意味着“进程A”调用“进程B”
  • C#方法一种调用方法B, - 在C#中的任何正常调用
  • C#调用COM(这是你的代码片段正在做什么)
  • 通过反射技术调用。这也在你的样本中

你的问题的答案取决于你正在谈论的是哪一个。

如果您只想在同一应用领域中将功能A和功能b置于一般情况下,请查看AOP - Aspect Oriented Programming in C#

或拦截http://www.codeproject.com/Articles/8436/Intercepting-method-calls-in-C-an-approach-to-AOSD

或者查看城堡动态代理http://docs.castleproject.org/Default.aspx?Page=DynamicProxy