Autofac 无法从远程程序集中解析对象(转换为已知类型)
Autofac fails to initailly resolve object from remote assembly (cast to know type)
这是我的 WCF(vs2015@net452) autofac (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)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)
at My.DoSomeWork() at C:\Projects\...
<Type>Autofac.Core.DependencyResolutionException</Type>
MyService.dll
指的是MyDefs.dll
.
MyRemotingHost.dll
指的是MyDefs.dll
.
MyService.dll
通过远程调用 MyRemotingHost.dll
。 RemoteObjectFactory.GetInstance
是一种包装方法,returns(通过远程处理)从 MyRemotingHost.dll
.
到 MySession
对象的透明代理
抽象 class MySessionBase
实现 ISession
。两者都在 MyDefs.dll
.
中定义
Class MySession
是 MySessionBase
的子类,在 MyRemotingHost.dll
.
中定义
严格来说MyService.dll
不知道MyRemotingHost.dll
也不应该知道。为什么 autofac 会尝试获取有关此远程程序集的信息?
更新
ISession session = (MySessionBase)RemoteObjectFactory.GetInstance(typeof(MySessionBase));
builder.RegisterInstance(session);
RegisterInstance 抛出同样的错误。
更新2
第二次(及后续)解决尝试 不抛出 奇怪的错误。
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 的逐步调试显示在第一次调用枚举器时,错误源位于 foreach
循环内的 Autofac.Core.Resolving.ResolveOperation
:
private void CompleteActivations()
{
var completed = _successfulActivations;
ResetSuccessfulActivations();
foreach (var activation in completed)
activation.Complete();
}
我无法进行更多调查,因为我坚持使用 VS2015,而 autofac 源已经具有 VS2017 格式。
问题出在 log4net autofac module:
var instanceType = instance.GetType();
在该行之前添加检查可解决问题:
// cant use GetType() on TransparentProxy as it may throw error
if (RemotingServices.IsTransparentProxy(instance)) return;
这是我的 WCF(vs2015@net452) autofac (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)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)
at My.DoSomeWork() at C:\Projects\...
<Type>Autofac.Core.DependencyResolutionException</Type>
MyService.dll
指的是MyDefs.dll
.
MyRemotingHost.dll
指的是MyDefs.dll
.
MyService.dll
通过远程调用 MyRemotingHost.dll
。 RemoteObjectFactory.GetInstance
是一种包装方法,returns(通过远程处理)从 MyRemotingHost.dll
.
MySession
对象的透明代理
抽象 class MySessionBase
实现 ISession
。两者都在 MyDefs.dll
.
Class MySession
是 MySessionBase
的子类,在 MyRemotingHost.dll
.
严格来说MyService.dll
不知道MyRemotingHost.dll
也不应该知道。为什么 autofac 会尝试获取有关此远程程序集的信息?
更新
ISession session = (MySessionBase)RemoteObjectFactory.GetInstance(typeof(MySessionBase));
builder.RegisterInstance(session);
RegisterInstance 抛出同样的错误。
更新2 第二次(及后续)解决尝试 不抛出 奇怪的错误。
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 的逐步调试显示在第一次调用枚举器时,错误源位于 foreach
循环内的 Autofac.Core.Resolving.ResolveOperation
:
private void CompleteActivations()
{
var completed = _successfulActivations;
ResetSuccessfulActivations();
foreach (var activation in completed)
activation.Complete();
}
我无法进行更多调查,因为我坚持使用 VS2015,而 autofac 源已经具有 VS2017 格式。
问题出在 log4net autofac module:
var instanceType = instance.GetType();
在该行之前添加检查可解决问题:
// cant use GetType() on TransparentProxy as it may throw error
if (RemotingServices.IsTransparentProxy(instance)) return;