错误激活IInterceptor …只能通过COM?

TL; DR: Kernel.Get在从.net / WPF应用程序调用时起作用,但是当从VB6应用程序调用时,会发生内部ActivationException (在TargetInvocationException内部)。 WTH?

这是对这个问题的一个跟进,我在这个问题中配置了一个具有Ninject约定的抽象工厂,这样我就不需要实际实现一个,Ninject工厂扩展负责生成一个动态。

这很好用……直到我需要从VB6代码运行我的库。

 _kernel.Bind(t => t.FromAssemblyContaining(typeof(ViewModelBase)) .SelectAllInterfaces() .EndingWith("ViewFactory") .BindToFactory()); 

一旦我从VB6代码调用应用程序上的任何内容,如果我将依赖项的解析包装在try / catch块中,我将使用内部ActivationException捕获TargetInvocationException

使用IInterceptor Provider的条件隐式自绑定激活IInterceptor时出错返回null。 激活路径:

3)将依赖性IInterceptor注入到IViewFactoryProxy类型的构造函数的参数中

2)将依赖IViewFactory注入到MsgBox类型的构造函数的参数viewFactory中

1)请求IMsgBox

建议:

1)确保提供程序正确处理创建请求。

我没有引用Ninject.Interception扩展(此时)。

奇怪的是,如果不是启动VB6,我在调试时启动沙盒WPF测试应用程序,我没有得到任何ActivationException ,一切都像魅力一样。

VB6代码死于automation error -2146232828 (80131604) ,谷歌没有产生任何结果,但我猜它与抛出的TargetInvocationException

就.net代码而言, 它只是起作用 :如果我从WPF客户端编写应用程序,我可以在MsgBox类构造函数中查看并看到IViewFactory参数对IViewFactory感到满意; 如果我从VB6 ActiveX DLL编写应用程序(我还创建了一个VB6 EXE进行测试,并且与DLL相同),它会爆炸。

UPDATE

我删除了通用抽象工厂,我不再收到此错误。 因为我不想写工厂,所以我采取了一些更紧密的耦合,我可以忍受。 现在我想知道为什么会这样!

我今天在一个完全不同的背景下遇到了这个例外。 我试图在VS WPF设计器中的设计时间视图模型中使用配置了自定义模块的内核。 该模块具有使用ToFactory()扩展方法配置的许多接口。

问题在于,由于某些原因,在我初始化内核时没有自动加载Ninject.Extensions.Factory.FuncModule ,这可能是由于VS设计师处理创建设计时类的方式有些诡计(可能是因为它没有加载适当的assembly或什么,谁知道)。

我有一个unit testing正在创建这些设计时间视图模型之一,它完美地工作,所以它绝对是与设计师相关的东西。

我通过为我的设计时间视图模型创建一个特殊的内核来解决这个问题。

 public class DT_Kernel : StandardKernel { public DT_Kernel() : base(new MyModule()) { if (!HasModule(typeof(FuncModule).FullName)) { Load(new[] { new FuncModule() }); } } } 

此代码的重要部分是加载FuncModule的位(如果尚未加载)。

您可以利用该代码来解决您的问题。