C# 4.0 方法执行在C中是如何工作的#

C# 4.0 方法执行在C中是如何工作的#,c#-4.0,C# 4.0,在C中#当应用程序A使用应用程序句柄调用应用程序B时,例如(IAppB)Activator.CreateInstance(Type.GetTypeFromProgID('AppB'))).CallMe(),应用程序A如何将调用发送到应用程序B?我不是在要求对硬件层进行解释,我是在试图弄清楚是否有可能以某种方式捕获对应用程序的方法调用,以便将它们搞乱。您在这里混淆了多种内容 应用程序A调用应用程序B-这通常意味着“进程A”调用“进程B” 方法A调用方法B,-C中的任何正常调用# C#调用COM(

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

您在这里混淆了多种内容

  • 应用程序A调用应用程序B-这通常意味着“进程A”调用“进程B”
  • 方法A调用方法B,-C中的任何正常调用#
  • C#调用COM(这就是你的代码片段正在做的事情)
  • 通过反射技术调用。你的样品里也有
你的问题的答案取决于你所说的到底是哪一个

如果您正在查看同一应用程序域中的函数A和函数b,请查看AOP-

或拦截


或者查看castle dynamic proxy

给定用法和名称,很可能您正在对进程外COM服务器进行方法调用。它的机制可以填满一本书(很多人都写过),所以只需简单概述一下

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

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

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