加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 仅通过COM激活IInterceptor时出错?

发布时间:2020-12-16 01:56:56 所属栏目:百科 来源:网络整理
导读:TL; DR:Kernel.Get T从.net / WPF应用程序调用时可以正常工作,但是当从VB6应用程序调用时会发生内部ActivationException(在TargetInvocationException内). WTH? 这是this question的一个后续工作,在那里我使用Ninject约定配置了一个抽象工厂,这样我就不需
TL; DR:Kernel.Get< T>从.net / WPF应用程序调用时可以正常工作,但是当从VB6应用程序调用时会发生内部ActivationException(在TargetInvocationException内). WTH?

这是this question的一个后续工作,在那里我使用Ninject约定配置了一个抽象工厂,这样我就不需要实际实现一个,Ninject工厂扩展负责生成一个动态.

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

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

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

Error activating IInterceptor using conditional implicit self-binding
of IInterceptor Provider returned null. Activation path:

3) Injection of dependency IInterceptor into parameter of constructor of type IViewFactoryProxy

2) Injection of dependency IViewFactory into parameter viewFactory of constructor of type MsgBox

1) Request for IMsgBox

Suggestions:

1) Ensure that the provider handles creation requests properly.

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

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

VB6代码死于自动化错误-2146232828(80131604),谷歌没有产生任何结果,但我猜它与抛出的TargetInvocationException有关.

就.net代码而言,它只是起作用:如果我从WPF客户端编写应用程序,我可以在MsgBox类构造函数中打破并看到IViewFactory参数对Castle.Proxy.IViewFactoryProxy满意;如果我从VB6 ActiveX DLL中编写应用程序(我还创建了一个VB6 EXE来测试和DLL一样),它会爆炸.

UPDATE

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

解决方法

我今天在一个完全不同的背景下遇到了这个例外.我试图在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的位(如果尚未加载).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读