2010-06-20 148 views
2

我需要通过RealProxy调用带ref-arguments的方法。我已经将问题隔离到以下代码:通过RealProxy参考参数

using System; 
using System.Reflection; 
using System.Runtime.Remoting.Messaging; 
using System.Runtime.Remoting.Proxies; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      HelloClass hello=new HelloClass(); 
      TestProxy proxy = new TestProxy(hello); 
      HelloClass hello2 = proxy.GetTransparentProxy() as HelloClass; 

      string t = ""; 
      hello2.SayHello(ref t); 
      Console.Out.WriteLine(t); 
     } 
    } 

    public class TestProxy : RealProxy 
    { 
     HelloClass _hello; 

     public TestProxy(HelloClass hello) 
      : base(typeof(HelloClass)) 
     { 
      this._hello = hello; 
     } 

     public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg) 
     { 
      IMethodCallMessage call = msg as IMethodCallMessage; 
      object returnValue = typeof(HelloClass).InvokeMember(call.MethodName, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, _hello, call.Args); 
      return new ReturnMessage(returnValue, null, 0, call.LogicalCallContext, call); 
     } 
    } 

    public class HelloClass : MarshalByRefObject 
    { 
     public void SayHello(ref string s) 
     { 
      s = "Hello World!"; 
     } 
    } 
} 

该程序应产生“Hello World!”输出,但不知何故ref参数的修改会在代理中丢失。我需要做些什么才能使其发挥作用?

回答

7

ReturnMessage的第二个参数需要包含要传回的ref和out参数的值。你可以通过保存对你传入的数组的引用来得到它们:

​​
+0

非常感谢!这非常有帮助。 – Guge 2010-06-21 07:07:20

+0

谢谢,它像一个魅力 – phuongnd 2016-07-05 04:35:05