C# 激活IInterceptor时出错。。。只有通过COM?
TL;DR:C# 激活IInterceptor时出错。。。只有通过COM?,c#,vb6,ninject,com-interop,C#,Vb6,Ninject,Com Interop,TL;DR:Kernel.Get在从.net/WPF应用程序调用时工作,但在从VB6应用程序调用时会出现内部ActivationException(在targetingException内部)。什么? 这是我用Ninject约定配置了一个抽象工厂的一点后续工作,这样我就不需要实际实现一个抽象工厂,Ninject工厂扩展负责动态生成一个抽象工厂 这工作做得很好。。。直到我需要从VB6代码运行我的库 _kernel.Bind(t => t.FromAssemblyContaining(type
Kernel.Get
在从.net/WPF应用程序调用时工作,但在从VB6应用程序调用时会出现内部ActivationException
(在targetingException
内部)。什么?
这是我用Ninject约定配置了一个抽象工厂的一点后续工作,这样我就不需要实际实现一个抽象工厂,Ninject工厂扩展负责动态生成一个抽象工厂
这工作做得很好。。。直到我需要从VB6代码运行我的库
_kernel.Bind(t => t.FromAssemblyContaining(typeof(ViewModelBase))
.SelectAllInterfaces()
.EndingWith("ViewFactory")
.BindToFactory());
一旦我从VB6代码调用应用程序上的任何内容,如果我将依赖项的解析包装在一个try/catch块中,我就用一个内部的ActivationException
捕获了一个targetingException
:
使用条件隐式自绑定激活IInterceptor时出错
IInterceptor提供程序的返回值为null。激活路径:
3) 将依赖项IIInterceptor注入IViewFactoryProxy类型构造函数的参数
2) 将依赖项IViewFactory注入MsgBox类型构造函数的参数viewFactory
1) IMsgBox请求
建议:
1) 确保提供程序正确处理创建请求
我没有提到Ninject.Interception扩展(此时)
奇怪的是,如果我在调试时没有启动VB6而是启动了一个沙盒WPF测试应用程序,我没有得到任何ActivationException
,一切都像一个魔咒一样工作
VB6代码死于自动化错误-2146232828(8013604)
,这在Google上不会产生任何结果,但我猜这与抛出的targetingException
有关
就.net代码而言,它可以正常工作:如果我从WPF客户端编写应用程序,我可以打开MsgBox
类构造函数,查看IViewFactory
参数对Castle.Proxy.IViewFactoryProxy
很满意;如果我使用VB6 ActiveX DLL编写应用程序(我还创建了一个VB6 EXE进行测试,与DLL相同),它会崩溃
更新
我删除了一般的抽象工厂,不再出现这个错误。因为我不想写工厂,所以我选择了一种我可以接受的更紧密的耦合。现在我想知道为什么会这样 我今天遇到了这个例外,与您完全不同。我试图在VSWPF设计器的设计时视图模型中使用配置了自定义模块的内核。该模块使用
ToFactory()
扩展方法配置了许多接口
问题是由于某种原因,Ninject.Extensions.Factory.FuncModule
在我初始化内核时没有自动加载,这可能是由于VS designer处理创建设计时类的方式存在一些欺骗(可能它没有加载适当的程序集或其他东西,谁知道呢)
我做了一个单元测试,创建了其中一个设计时视图模型,它工作得很好,所以它肯定与设计师有关
我修复了这个问题,为我的设计时视图模型创建了一个特殊的内核
public class DT_Kernel : StandardKernel
{
public DT_Kernel()
: base(new MyModule())
{
if (!HasModule(typeof(FuncModule).FullName))
{
Load(new[] { new FuncModule() });
}
}
}
此代码的重要部分是加载FuncModule(如果尚未加载)的位
您可能能够利用该代码来解决问题。我怀疑,如果试图在WPF设计器中使用配置了Ninject Factory扩展的模块,可能会遇到同样的问题。不过,我并没有使用约定,只是一个手动配置的.ToFactory()。你有没有搞清楚这一点?也许这与“应用程序”(vb6,VS designer)如何加载程序集有关。默认情况下,ninject将加载条目(?)程序集所在路径中所有“ninject.extensions.*.dll”的模块。可能使用vb6和VS designer时,条目程序集位置不可用/不正确。如果有机会,我将查看是否可以在初始化设计时视图模型的代码中添加一些日志,并写入已知的日志文件。我可以检查入口/执行程序集及其位置,并查看Ninject库是否在那里。哇,我刚刚遇到了完全相同的问题,正在为VBE开发COM加载项。用一个新的
FuncModule
实例加载我的StandardKernel
解决了这个问题:private readonly IKernel\u kernel=new StandardKernel(new FuncModule())代码>-无需创建自定义内核类型,只需将Ninject.Extensions.Factory.FuncModule
加载到内核中即可(这基本上就是您在这里所做的)。用谷歌搜索一个问题,并在你提出的问题上找到你的解决方案,这很有趣。。。两年前!