本帖最后由 fanyufanyu 于 2013-11-14 17:20:42 编辑

解决方案 »

  1.   

    反射可以操作private set,private method.但是不代表你set了以后就会产生效果。要知道一个进程操作另外一个进程必须采用注入的方式。
      

  2.   

    http://www.vckbase.com/index.php/wv/1340.htmlManagedSpy是写在一个名为ManagedSpyLib的托管C++库上的。ManagedSpyLib的目标是允许在另一个进程中按计划访问基于.NET Framework的窗体。ManagedSpyLib暴露了一个名为ControlProxy的类,它代表了在另一个进程中的一个控件。虽然它不是一个实际的控件,你可以访问它代表的所有属性和事件。 ManagedSpyLib用一个内存映射(memory-mapped)文件在窥探和被窥探进程之间传递数据而起作用。
      

  3.   

    感谢楼上的朋友,我现在用的是另一个,.NET Object Spy 原理差不多。
    http://www.codeproject.com/Articles/16481/NET-Object-Spy-and-InvokeRemote
    封装了一个方法
    object Injector.InvokeRemote(IntPtr hWnd, string assemblyFile,
    string typeName, string methodName, object[] args)
    我的代码
    element = TF.Find(childformelement, "Form4", "");
    Injector.InvokeRemote((System.IntPtr)element.Current.NativeWindowHandle, @"..\..\..\..\WindowsFormsUI\bin\x86\Release\" + filemainname + ".exe", "WindowsFormsUI.Form4", "TestAdd", null);报异常提示说未找到方法WindowsFormsUI.Form4.TestAdd,很奇怪的问题。
    用spy++看了一下,异常窗口是WindowsFormsUI报的,说明注入成功了。
      

  4.   

    上面那个错误解决了。
    发现和我之前写的反射代码的绑定条件不一样,增加了一个BindingFlags::Instance条件,不报那个错了。
    Object^ retVal = type->InvokeMember(msg->MethodName, BindingFlags::Static | BindingFlags::Public | BindingFlags::InvokeMethod |BindingFlags::Instance , nullptr, nullptr, msg->Args);现在报非静态方法需要一个目标的错误。
      

  5.   

    静态方法没有问题,再问一下InvokeMember怎么得到一个类实例作为返回值呢?
      

  6.   

    改用ManagedSpy了,组件属性可以读写了,方法再试试,先结贴吧。