Mono 1.1.7 vs .Net FX 1.1.4322
От: Aggtaa Россия  
Дата: 02.06.05 09:15
Оценка:
Никто с таким не сталкивался?

Простенький тест, под виндой выдает
1 argument(s) passed to constructor.

Под линуксом
MethodCall.Args background field is missing.

Такое впечатление, что у System.Runtime.Remoting.Messaging.MethodCall в Mono отсутствует внутреннее поле с аргументами, из-за чего свойство Args — null, а ArgCount и GetArg() просто валятся с NullReferenceException.

    public class P1 : Test
    {
        public P1(string str)
        {
            Console.WriteLine("Constructed " + str);
        }
    }

    [Test]
    public abstract class Test : ContextBoundObject
    {
    }

    [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public class TestAttribute : ProxyAttribute
    {
        public TestAttribute() 
        {
        }

        public override MarshalByRefObject CreateInstance(Type objectType)
        {  
            TestProxy proxy = new TestProxy(objectType);
            return (Test)proxy.GetTransparentProxy();
        }
    }

    public class TestProxy : RealProxy
    {
        private Test target;

        public TestProxy(Type objectType) 
            : base(objectType)
        {
            
        }

        public override IMessage Invoke(IMessage message)
        {
            if (message is IConstructionCallMessage)
            {
                IConstructionReturnMessage retMessage = EnterpriseServicesHelper.CreateConstructionReturnMessage(
                    (IConstructionCallMessage)message, (MarshalByRefObject)GetTransparentProxy());

                if (target == null)
                {
                    try
                    {
                        Console.WriteLine(((IConstructionCallMessage)message).Args.Length.ToString() + "  argument(s) passed to contructor.");
                    }
                    catch (NullReferenceException)
                    {
                        Console.WriteLine("MethodCall.Args background field is missing.");
                    }


                    Type objectType = GetProxiedType();
                    TestProxy proxy = new TestProxy(objectType);
                    proxy.InitializeServerObject((IConstructionCallMessage)message);
                    target = (Test)proxy.GetUnwrappedServer(); 
                }
                
                return retMessage;
            }
        
            IMethodCallMessage methodMessage = (IMethodCallMessage)message;
            IMethodReturnMessage returnMessage = RemotingServices.ExecuteMessage(target, methodMessage);
            return returnMessage;
        }
    }
    
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            P1 p1 = new P1("test");
        }
    }
A.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.