zoukankan      html  css  js  c++  java
  • 透明代理和泛型接口之间一个莫名其妙的问题

    在使用 .Net 4.0 运行时框架 RealProxy 类构造一个透明代理时,如果目标接口为泛型类型,或者继承一个泛型接口时,再通过 new Func 的方式调用泛型接口上的方法即会出现 System._Canon 类的问题。

    很奇怪的一个问题,找了一个多小时了,已经追到 Com 函数调用了,仍然没找到原因,初步诊断为 .Net 框架的一个 Bug 。

    代码如下:

    using System;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    
    namespace TestRealProxy
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                var service = new MyRealProxy().GetTransparentProxy() as IInterface;
    
                // 正确的结果
                var right = service.GetById(4);
    
                // 错误的结果
                Func<int, MyClass> func = service.GetById;
                var error = func(3);
            }
        }
    
        public interface IInterface<T> where T : class
        {
            T GetById(int id);
        }
    
        public interface IInterface : IInterface<MyClass>
        {
        }
    
        public class MyClass
        {
            public int Id { get; set; }
        }
    
        public class MyRealProxy : RealProxy
        {
            public MyRealProxy()
                : base(typeof(IInterface))
            {
            }
    
            public override IMessage Invoke(IMessage msg)
            {
                IMethodCallMessage methodCall = (IMethodCallMessage)msg;
    
                IMethodReturnMessage methodReturn = null;
                object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[];
                methodCall.Args.CopyTo(copiedArgs, 0);
                try
                {
                    object returnValue = new MyClass { Id = (int)methodCall.Args[0] };
                    methodReturn = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall);
                }
                catch (Exception ex)
                {
                    methodReturn = new ReturnMessage(ex, methodCall);
                }
    
                return methodReturn;
            }
        }
    }

    谁能解决这个问题?

  • 相关阅读:
    Windows驱动开发-设备读写方式
    Windows驱动开发-r3和r0通信
    Windows驱动开发-内核常用内存函数
    Windows驱动开发-DeviceIoControl函数参数dwIoControlCode
    Windows驱动开发-派遣函数格式
    Windows驱动开发-符号链接和设备名
    windows驱动不要签名
    git使用问题二删除远程仓库文件,本地保留不动
    git使用问题一新建本地仓库添加远程合并推送
    秦汉
  • 原文地址:https://www.cnblogs.com/lenic/p/3967108.html
Copyright © 2011-2022 走看看