3

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 相同),它就会爆炸。

更新

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

4

1 回答 1

7

我今天在与您完全不同的情况下遇到了这个异常。我试图在 VS WPF 设计器的设计时视图模型中使用配置有自定义模块的内核。该模块有许多接口配置使用ToFactory()扩展方法配置的接口。

问题是由于某种原因Ninject.Extensions.Factory.FuncModule在我初始化内核时没有自动加载,可能是由于 VS 设计器处理创建设计时类的方式存在一些技巧(也许它没有加载适当的程序集或其他东西,谁知道呢? )。

我有一个单元测试正在创建这些设计时视图模型之一,它运行良好,所以它肯定与设计师有关。

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

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

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

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

于 2014-03-04T11:52:25.010 回答