2009-07-22 78 views
2

我很好奇,如果有人知道的监控.NET应用程序的运行时信息的一种方式(被称为什么方法和这样)如何从一个单独的应用程序

,并注入额外的代码注入在C#中的方法调用代码从独立运行的进程中运行某些方法。

说,我有两个应用:

app1.exe,为了简单起见可能是

class Program 
{ 
    static void Main(string[] args) 
    { 
     while(true){ 
     Somefunc(); 
     } 
    } 

    static void Somefunc() 
    { 
     Console.WriteLine("Hello World"); 
    } 
} 

,我有我希望能够检测第二应用程序时,从应用Somefunc() 1正在运行,并且注入自己的代码,

class Program 
{ 
    static void Main(string[] args) 
    { 
     while(true){ 
      if(App1.SomeFuncIsCalled) 
      InjectCode(); 
     } 
    } 

    static void InjectCode() 
    { 
     App1.Console.WriteLine("Hello World Injected"); 
    } 
} 

那么其结果将是一个应用程序将显示

Hello World 
Hello World Injected 

我明白它不会是这么简单(通过长镜头拍摄) 但我不知道这是否甚至可能,以及它是从哪里开始的。

有什么建议吗?

我见过类似的完成在Java中,但从来没有在C#。

编辑: 为了澄清,这将是一个插件系统添加到基于.Net的游戏,我无法访问的源代码。

回答

1

随着你在评论中做出的澄清,在我看来,使用ildasm和ilasm进行反汇编和重组会更好。

+0

IM想着你,我是正确的。我希望这不会成为现实。 – Fusspawn 2009-07-22 16:53:59

2

您需要使用Profiling API将第二个节目配置文件设置为第一个。您的面包车会被通知任何方法调用。

+0

虽然这不会对修改有所帮助。 – 2009-07-22 16:45:21

2

那么,要做到这一点,没有App1的许可是困难的。但假设你真的想在App1中创建一个扩展点,那么使用某种可扩展性框架来进行建议是相对简单的。我建议:

由于我比较熟悉MEF,这里是它会怎样看:

class Program 
{ 
    [ImportMany("AddinContractName", typeof(IRunMe))] 
    public IEnumerable<IRunMe> ThingsToRun { get; set; } 

    void SomeFunc() 
    { 
     foreach(IRunMe thing in ThingsToRun) 
     { 
      thing.Run(); 
     } 
     /* do whatever else ... */ 
    } 
} 
+0

虽然我知道这在道德上有点错误,但让我解释一下它现在的用途,我喜欢玩一个没有任何形式的插件支持的小型单人游戏(游戏也是基于.net的),但在那里是我想为自己的版本的一些自定义插件 无法访问代码/或缺乏插件系统,我打算让我自己,我没有打算或向公众发布此, – Fusspawn 2009-07-22 16:50:22

+0

这也意味着我无权修改App1的代码 – Fusspawn 2009-07-22 16:50:58

+0

@Fusspawn - 我明白了。起初我不确定是否有权访问应用1的代码。我看到你已经编辑你的问题来澄清。谢谢。 – 2009-07-22 17:09:41

1

另一个想法是编写一个应用程序,将改变你想监视的exe文件。它会做类似于分析工具在“测试”你的应用程序时所做的事情。基本上,您使用反射来浏览应用程序,然后使用.NET的Emit功能重新创建exe(使用不同的文件名),并同时插入您的代码。

当然,如果应用程序试图安全地做事,则可能不允许这个新版本与其他程序集进行通信。

0

根据作者如何打包/构建他的应用程序,您可能能够从您自己的项目中添加对他的EXE文件的引用,并且只需从您自己的应用程序中执行他的代码。如果这有效,那么只需要使用Reflection就可以获得有用的接口/事件/等等(如果它们被标记为私有的话......否则直接使用它们)。您可以添加对使用调试或发布版本的默认设置构建的任何EXE的引用,并像使用DLL一样使用它。

如果不工作也有可以使用,以及换出的方法调用和这样的高级技巧,但是这超出了本答复的范围......我建议首先尝试参考的东西。

0

将代码注入正在运行的应用程序是可能的。 This是一个工作示例,但涉及注入非托管dll。在装配

0

您可以尝试CInject注入你的C#或VB.NET代码到组件

相关问题