TL;DR:Kernel.Get<T>
从 .net/WPF 应用程序调用时有效,但从 VB6 应用程序调用时会因内部ActivationException
(在 a内)而爆炸。TargetInvocationException
什么?
这是对这个问题的后续跟进,我用 Ninject 约定配置了一个抽象工厂,这样我就不需要实际实现一个,Ninject 工厂扩展负责即时生成一个。
这工作得很好......直到我需要从 VB6 代码运行我的库。
_kernel.Bind(t => t.FromAssemblyContaining(typeof(ViewModelBase))
.SelectAllInterfaces()
.EndingWith("ViewFactory")
.BindToFactory());
一旦我从 VB6 代码调用应用程序上的任何内容,如果我将依赖项解析包装在 try/catch 块中,我将TargetInvocationException
使用内部捕获 a ActivationException
:
使用 IInterceptor Provider 的条件隐式自绑定激活 IInterceptor 时出错,返回 null。激活路径:
3) 将依赖 IInterceptor 注入到 IViewFactoryProxy 类型的构造函数的参数中
2) 将依赖IViewFactory注入到MsgBox类型构造函数的参数viewFactory中
1) 请求 IMsgBox
建议:
1) 确保提供者正确处理创建请求。
我没有提到 Ninject.Interception 扩展(此时)。
奇怪的是,如果我在调试时启动了一个沙盒 WPF 测试应用程序,而不是启动 VB6,我没有得到任何ActivationException
东西,而且一切都像一个魅力。
VB6 代码automation error -2146232828 (80131604)
在谷歌上没有任何结果,但我猜它与TargetInvocationException
被抛出有关。
就 .net 代码而言,它可以正常工作:如果我从 WPF 客户端编写应用程序,我可以中断MsgBox
类构造函数并看到参数对;IViewFactory
感到满意 Castle.Proxy.IViewFactoryProxy
如果我从 VB6 ActiveX DLL 编写应用程序(我还创建了一个 VB6 EXE 来测试并且与 DLL 相同),它就会爆炸。
更新
我删除了通用抽象工厂,并且不再收到此错误。而且因为我不想编写工厂,所以我选择了一些我可以忍受的更紧密的耦合。现在我想知道为什么会这样!