带有IObservable的MethodCallExpression会向System.CoreEx抛出访问被拒绝的异常

时间:2010-10-06 15:29:56

标签: c# .net lambda system.reactive

我有一个MethodCallExpression对象,我试图使用IObservable<Thing>框架返回Reactive Extensions个实例。

private IObservable<Thing> GetThing(Expression<Func<Thing>> expression)
{
   Func<Thing> method = expression.Compile()
   var observable = Observable.FromAsyncPattern<Thing>(method.BeginInvoke, method.EndInvoke);
   IObservable<Thing> observable = observable();
   return observable;
}

问题在于,当执行此操作时,我在observable()上获得以下运行时异常:

  

无法加载文件或程序集'System.CoreEx,Version = 1.0.2617.104,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。访问被拒绝。

如果我运行没有Reactive框架的方法,一切都很好。

 Thing item = method();

任何想法导致了什么?添加所有装配参考。

编辑我应该补充说,有问题的表达式包含一个在使用Moq创建的Mocked对象上执行的方法。

2 个答案:

答案 0 :(得分:0)

是否为当前用户安装了反应框架?你有这个文件的读/可执行文件吗?

答案 1 :(得分:0)

我设法让它工作,虽然我从来没有真正到达Access Denied问题的底部。可能是重新启动解决了它。在重新剥离我的代码并重建它之后,我开始得到一个不同的错误:

The object must be a runtime Reflection object

然后我在应用Rx之前更改了代码以将方法调用包装到Action,这样就可以了:

private IObservable<Thing> GetThing(Expression<Func<Thing>> expression)
{
   var method = expression.Compile();
   Func<Thing> = () => method();
   var observable = Observable.FromAsyncPattern<Thing>(method.BeginInvoke, method.EndInvoke);
   return observable();
}

为了记录,我能够进一步减少这一点:

private IObservable<Thing> GetThing(Expression<Func<Thing>> expression)
{
   var method = expression.Compile();
   Func<Thing> action = () => method();
   return Observable.Start(action);
}