3

TL;DR: .net/WPF アプリから呼び出された場合は機能しますが、VB6 アプリから呼び出された場合は内部( a内)Kernel.Get<T>で爆発します。え?ActivationExceptionTargetInvocationException

これは、実際に実装する必要がないように、Ninject 規則を使用して抽象ファクトリを構成したこの質問のちょっとしたフォローアップです。

これは見事に機能しました... VB6 コードからライブラリを実行する必要が生じるまで。

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

VB6 コードからアプリで何かを呼び出すとすぐに、依存関係の解決を try/catch ブロック内にラップするTargetInvocationExceptionと、内部でa をトラップしActivationExceptionます:

IInterceptor プロバイダーの条件付きの暗黙的な自己バインディングを使用して IInterceptor をアクティブ化する際にエラーが発生し、null が返されました。アクティベーション パス:

3) IViewFactoryProxy 型のコンストラクターのパラメーターへの依存関係 IInterceptor の注入

2) MsgBox 型のコンストラクターのパラメーター viewFactory への依存関係 IViewFactory の注入

1) IMsgBoxのリクエスト

提案:

1) プロバイダーが作成要求を適切に処理することを確認します。

Ninject.Interception 拡張機能への参照はありません (現時点では)。

奇妙なことに、VB6 を起動する代わりに、デバッグ時にサンドボックス WPF テスト アプリを起動すると、何も得られずActivationException、すべてが魅力的に機能します。

VB6 コードはautomation error -2146232828 (80131604)終了し、Google では何も得られませんが、TargetInvocationExceptionスローされたことに関係していると思います。

.net コードに関する限り、それは機能します。WPF クライアントからアプリを作成すると、MsgBoxクラス コンストラクターを中断して、パラメーターが;IViewFactoryに満足していることを確認できます。Castle.Proxy.IViewFactoryProxyVB6 ActiveX DLL からアプリを作成すると (テスト用に VB6 EXE も作成し、DLL と同じです)、アプリが爆発します。

アップデート

一般的な抽象ファクトリを削除したところ、このエラーは発生しなくなりました。そして、私は工場を書きたくないので、私が耐えられるように、もう少し密結合を選びました。どうしてこうなったのか今すぐ知りたい!

4

1 に答える 1

7

私は今日、あなたとはまったく異なる状況でこの例外に遭遇しました。VS WPF デザイナーのデザイン タイム ビュー モデル内のカスタム モジュールで構成されたカーネルを使用しようとしていました。ToFactory()モジュールには、拡張メソッドを使用して構成された多数のインターフェースがありました。

問題は、カーネルを初期化するときに何らかの理由でNinject.Extensions.Factory.FuncModuleが自動的にロードされなかったことです。おそらく、VS デザイナーが設計時のクラスの作成を処理する方法に何らかのトリックがあったためです (適切なアセンブリまたは何かをロードしなかった可能性があります)。 )。

これらの設計時のビュー モデルの 1 つを作成する単体テストがありましたが、それは完全に機能したので、それは間違いなくデザイナーに関連するものでした。

設計時のビュー モデル用に特別なカーネルを作成することで、この問題を修正しました。

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 に答える