TL;DR: Kernel.Get<T>
从 .net/WPF 应用程序调用时可以工作,但会因内部原因而崩溃ActivationException
(在一个TargetInvocationException
) 当从 VB6 应用程序调用时。啥?
这是一个后续这个问题 https://stackoverflow.com/questions/17729630/setting-up-a-convention-for-automatic-factories我使用 Ninject 约定配置了一个抽象工厂,这样我就不需要实际实现一个抽象工厂,Ninject 工厂扩展负责即时生成一个抽象工厂。
这工作得很好......直到我需要从 VB6 代码运行我的库。
_kernel.Bind(t => t.FromAssemblyContaining(typeof(ViewModelBase))
.SelectAllInterfaces()
.EndingWith("ViewFactory")
.BindToFactory());
一旦我从 VB6 代码调用应用程序上的任何内容,如果我将依赖项的解析包装在 try/catch 块内,我就会捕获一个TargetInvocationException
具有内在的ActivationException
:
使用条件隐式自绑定激活 IInterceptor 时出错
IInterceptor Provider 返回 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 相同),它就会崩溃。
UPDATE
我删除了通用抽象工厂,并且不再出现此错误。因为我不想编写工厂,所以我选择了一些我可以忍受的更紧密的耦合。现在我想知道why这件事正在发生!