0

MAFを使用していますが、アドインのアクティブ化に問題があります。私の計画を説明させてください。

最初にセカンダリAppDomainを作成し、次にアドインをアクティブ化しようとします。

MyAddIn = Token.Activate<AddInHostView>(domain);

私のアドインは非常に単純で、1つのヘルパーアセンブリのみを参照しています。このヘルパーアセンブリがアドインのディレクトリにある場合、すべてのものが魅力のように機能します。

アドイン

  • MyDemoAddIn.dll
  • Helpers.dll

Helpers.dllを削除すると、アプリケーション全体がクラッシュします。

タイプ'System.IO.FileNotFoundException'の最初のチャンスの例外がMyDemoAddIn.DLL'PresentationHost.exe'(管理対象(v4.0.30319))で発生しました:ロードされた'C:\ WINDOWS \ Microsoft.Net \ assembly \ GAC_MSIL \ mscorlib.resources \ v4.0_4.0.0.0_de_b77a5c561934e089 \mscorlib.resources.dll'タイプ'System.Reflection.TargetInvocationException'のファーストチャンス例外がmscorlib.dllで発生しましたタイプ'System.Reflection.TargetInvocationException'のファーストチャンス例外がシステムで発生しました。 AddIn.dllタイプ'System.Reflection.TargetInvocationException'の最初のチャンスの例外がSystem.AddIn.dllで発生しました

私は例外処理ですべてをテストしました。Host、AddInView、または作成したAppDomainからの例外をキャッチできません:-(

誰かアイデアがありますか?

4

2 に答える 2

0

アドインはHelpers.dllなしでは実行できません。AppDomainの境界を越えて機能するため、アドインは独自のAppDomainにロードするために独自のDLLセットを必要とします。

クロスAppDomain機能が必要ない場合Token.Activate<AddInHostView>(AppDomain.CurrentDomain)、ホストプロジェクトでhelpers.dllが参照されていれば、それをロードするために使用できます。

于 2011-07-16T14:43:03.500 に答える
0

答えはあなたが思っているよりも簡単です...問題は、MAFの中間層であるAddInView.dllからのFinalizer()メソッドのエラーでした。これが私の解決策です。

デモ(ホスト)

try
{
    MyAddIn = Token.Activate<AddInHostView>(domain);
}
catch (Exception ex)
{
    try
    {
        AppDomain.Unload(domain);
        domain = null;
    }
    catch (ThreadAbortException threadAbortException)
    {
        //ToDo: Logging
    }
    catch (CannotUnloadAppDomainException cannotUnloadAppDomainException)
    {
        //ToDo: Logging
    }
    catch (Exception exception)
    {
        //ToDo: Logging
    }
}

AddInView

[AddInBase]
public class AddInView : UserControl
{
    //Necessary constructor to handle the exception.
    //Normal constructor is not called when an error occurs at startup!!!
    static AddInView()
    {
        AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload;
    }

    //Normal constructor
    public AddInView()
    {
        //Do other things...
        //e.g. Dispatcher.UnhandledException += Dispatcher_UnhandledException;
    }

    static void CurrentDomain_DomainUnload(object sender, EventArgs e)
    {
        //To cleanup and stuff
    }
}

これで、エラーが発生した場合(Activate <>)、例外ハンドラーがエラーをキャッチし(FileNotFound Helpers.dllが見つかりません)、メインのAppDomainをクラッシュさせることなくAppDomain全体をアンロードします:-)

于 2011-07-19T12:35:47.683 に答える