Autofac 无法从远程程序集(强制转换为已知类型)主动解析对象



这是我的WCF(vs2015@net452(自动fac (v4.6.1(设置:

MyService.dll:

builder.Register(c => (ISession)RemoteObjectFactory.GetInstance(typeof(MySessionBase))).As<ISession>().SingleInstance();
...
var session = AutofacHostFactory.Container.Resolve<ISession>();
<Message>An exception was thrown while executing a resolve operation. See the InnerException for details.
Could not load file or assembly "MyRemotingHost, Version=1.0.6442.29085, Culture=neutral, PublicKeyToken=null" or one of its dependencies. File not found(See inner exception for details.)</Message>
<StackTrace>at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)&#xD;
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object&amp; instance)&#xD;
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)&#xD;
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)&#xD;
at My.DoSomeWork() at C:Projects...
<Type>Autofac.Core.DependencyResolutionException</Type>

MyService.dll指的是MyDefs.dll

MyRemotingHost.dll指的是MyDefs.dll

MyService.dll通过远程处理调用MyRemotingHost.dllRemoteObjectFactory.GetInstance是一个包装器方法,它返回(通过远程处理(透明代理以从MyRemotingHost.dllMySession对象。

抽象类MySessionBase实现ISession。两者都在MyDefs.dll中定义。

MySessionMySessionBase的子项,在MyRemotingHost.dll中定义。

严格来说,MyService.dll不知道MyRemotingHost.dll,也不应该知道。那么为什么 autofac 试图获取有关此远程程序集的信息?

更新

ISession session = (MySessionBase)RemoteObjectFactory.GetInstance(typeof(MySessionBase));
builder.RegisterInstance(session);

RegisterInstance 抛出相同的错误。

Update2第二次(及后续(解析尝试不会引发错误,这很奇怪。

builder.Register(c => (ISession)RemoteObjectFactory.GetInstance(typeof(MySessionBase))).As<ISession>().SingleInstance();
...
var session1 = AutofacHostFactory.Container.Resolve<ISession>();
var session2 = AutofacHostFactory.Container.Resolve<ISession>();

var session1 = ...行引发错误。如果禁止显示错误,则下一行var session2 = ...不会产生错误。

基于 PDB 的分步调试显示,在第一次调用枚举器时,错误源位于循环foreachAutofac.Core.Resolving.ResolveOperation

private void CompleteActivations()
{
var completed = _successfulActivations;
ResetSuccessfulActivations();
foreach (var activation in completed)
activation.Complete();
}

我无法调查更多,因为我坚持使用 VS2015,而 autofac 源已经具有 VS2017 格式。

问题出在 log4net autofac 模块中:

var instanceType = instance.GetType();

在该行之前添加检查可以解决问题:

// cant use GetType() on TransparentProxy as it may throw error
if (RemotingServices.IsTransparentProxy(instance)) return;

最新更新