先上代码:见下图:
经过多次验证,发现在SCAN的第一个参数中报标题这个异常。这个异常的诡异之处在于:这段代码放在我的主程序中是没有问题的,现在截图的这个是通过测试框架调用的,就发生异常了。
通过对比两边的参数 remMonitor 
发现是一模一样的。恳请各位大仙帮我指点一下。PS: 是不是因为rsd继承了MarshalByRefObject,而remMonitor也继承了MarshalByRefObject
所以rsd调用remMonitor的时候就出现错了呢?
如果是这样的话,为何我的主程序就没错误?

解决方案 »

  1.   

    能把具体的异常信息贴出来么?还有就是如果原来的可以新的环境不行,看看你原来调用的dll,新环境里是否也具备?
      

  2.   

    你的问题是不是因为remMonitor不能转成IProgressStatus?
    remMonitor的定义代码贴出来看看?
      

  3.   

    remMonitor的定义在一楼,
    三张图片是三个不同的类,放在一起不好分辨 呵呵
    仔细看下 声明在第三张,定义在第一张。另:
    那个(IProgressStatus)是我另外加的,本身其实是没有的。
    见它下面那行代码。
    就是因为下面的那个报这个错误,所以我才加上这个(IProgressStatus)看看是否是它的问题。
    结果不是 呵呵 。
      

  4.   

    啊,你没有领会我的意思,我说的一模一样
    是指正常程序中 和 我这个测试程序中 的这个变量 是 一模一样。
    强调一模一样是为了排除这个变量本身的错误 呵呵
    [/Quote]
      

  5.   

    对象类型不一致。调试时看下两个的remMonitor的类型。别看里面的字段的值。
      

  6.   

    啊 啊 ?
    什么意思?不要这么惜字如金啊,我不是很明白你说的意思?
    你是说(IProcess)那个转换吗?
    如果是,请看它的下一行,没有那个转换 还是报错,
      

  7.   

    Scan1()方法和Scan()调用的参数是一样的?
      

  8.   

    对啊,只不过Scan1我加了个强制转化用来测试一下。
    结果还是错误的。
      

  9.   

    没有递归调用,RemoteSetupDomain 和 SetupDomain中都有Scan方法,
    这不是递归调用。
      

  10.   

    没有递归调用,RemoteSetupDomain 和 SetupDomain中都有Scan方法,
    这不是递归调用。
      

  11.   

    IProgressStatus remMonitor = new RemoteProgessStatus(monitor)
    这个替代掉 RemoteProgessStatus remMonitor = new RemoteProgessStatus(monitor)
    看看会不会报错
      

  12.   

    MarshalByRefObject 这个好像有什么问题的吧,我记得在via c# clr这个书上提到过这个MarshalByRefObject,但是具体是什么,我也不清楚,回去给你看看。
      

  13.   

    这个方法显然不行。因为RemoteProgessStatus 它不仅继承了 IProgressStatus 还继承了MarshalByRefObject,
    所以单纯的将其定义为IProgressStatus 会报错。
    我刚试过,的确报错,无法转化。
      

  14.   

    恩,我也觉得没问题。MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。我仔细的看了MSDN 没发现有任何可疑的地方。看看你晚上有什么发现没?
      

  15.   

    IProgressStatus 这个不是接口吗?RemoteProgessStatus实现了IProgressStatus的方法才对啊
    IProgressStatus remMonitor = new RemoteProgessStatus(monitor)
    这样实例化就报错的话,感觉比较迷茫了。一般来说只要实现了接口,那么这个对象本身就能直接用接口实例化出来
      

  16.   

    我自己做了个实验
    public interface IType
    {
       bool InsertType(TypeInfo type);
       bool UpdateType(TypeInfo type);
       bool DeleteType(int typeid);
    }
    public class User:MarshalByRefObject,IType
    {
       public void test(IType type)
       {}
       public bool InsertType(TypeInfo type)
       {
           return false;
       }
       public bool UpdateType(TypeInfo type)
       {
           return false;
        }
        public bool DeleteType(int typeid)
        {
            return false;
        }
    }public class Article
    {
            IType typeuser = new User();
            User user = new User();
            public Article()
    {
                user.test(typeuser);
    }
    }
    这样的调用编译和debug跑起来都不会出问题
      

  17.   

    你Scan()方法第一个参数换成别的对象看看,是不是还是报错
    Scan(RemoteProgessStatus remMonitor,.....)
      

  18.   


    Iprogressstatus在哪儿定义的?
    你的类哪个方法实现了这个接口定义?
    我没有看到呢?
      

  19.   

    =-=没想法了,再进一步做个小实验
    Scan()第一个参数不要用IProgressStatus 或 RemoteProgessStatus  对象,你随便从项目里拿个对象出来,再上面实例化后扔进去看,这样不会出错了吧
    不报错的话只能证明你class RemoteProgessStatus 在某个地方存在问题,或者是RemoteSetupDomain 里Scan()方法的参数你设置的不对
      

  20.   

    放个最简单的STRING没有问题
    其实最奇怪的问题是:
    我主程序调用到这里的时候就没有问题,
    我现在正在用nunit写单元测试,这个是SETUP中必须要走的步骤,它涉及了一些初始化工作。
    上下文跟主程序绝无二异,崩溃啊~
      

  21.   


    你的RemoteProgessStatus 没有实现任何IProgressStatus里面的方法呀?
    这样类型转换怎么不出错呢?
      

  22.   

    首先,你要把你所有的认为是真的假设统统抛弃,例如你认为两个完全一样,这样就不要再认为是一样的了。
    因为道理很简单,如果不是微软错了,那么你的假设退出来道理就推不走了,那么只有一种更可能,就是你的假设错了。这是我调试程序的经验。其次,如果故障确实是不能传入对象到IProgressStatus变量里面去,那么只有一种可能,就是你这个对象定义有问题,肯定是实现这个接口的环节出了问题,如果正确实现了接口,这样传送肯定是不会出问题的,虽然你认为你没有问题,但是你这个假设必须抛弃。仔细检查。最后,如果真的是主程序OK,Unit测试不行。拿肯定两个环境是不一样,这点不用质疑了,否则不可能出现这个问题。
    因为你给的信息太少,都是按照你的假设推理,显然肯定走入死胡同的,因为按照你的假设如果能推走,你就不会发这个问题贴了。所以,你的假设一定有不是你想象的地方。这样的问题经常遇到,但是根据经验,最后问题解决之后发现99%都是当初的假设错误。毕竟微软BUG的可能性还是他太小了。