16

Visual Studio 2012 をインストールするだけで、デリゲートを作成しようとすると、既存のアプリケーションがクラッシュします。

アプリケーションを実行しているときにこのエラーが発生するのはなぜですか?

Visual Studio 2012 は何らかの方法で .net 4.0 WindowsFormsIntegration を更新しますか?

これを回避する方法について何か提案はありますか?

「指定されたバインド制約に一致する型 'MyWindowsFormsHost' でのコンストラクターの呼び出しで、例外がスローされました。」

内部例外あり:

署名またはセキュリティ透過性がデリゲート型のものと互換性がないため、ターゲット メソッドにバインドできません

問題のあるクラスと行:

internal class MyWindowsFormsHost : WindowsFormsHost
{
    private delegate void NotifyChildFocus(ref Message m);
    private readonly NotifyChildFocus childGotFocus;

    public MyWindowsFormsHost()
    {
         //this line crashes now (and did not before VS2012 install)
         this.childGotFocus = Delegate.CreateDelegate(typeof(NotifyChildFocus),
                                 this, "NotifyActivateApp") as NotifyChildFocus;
    }
}

更新: NotifyActiveateApp メソッドが WindowsFormsHost に存在しなくなったことを発見しました。私が理解していないのは、Visual Studio 2012 で .net 4.5 をインストールすると、既存の 4.0 アプリケーションにどのような影響があるかということです。

更新: これを回避するために、リフレクションを使用して NotifyActivateApp メソッドが存在するかどうかを確認しました。(存在しない場合、アプリはパッチが適用された .net バージョンで実行されています...そして、この子フォーカス コードが修正するために書かれたアクティベーション バグについて心配する必要はありません)。

    MethodInfo methodInfo = (typeof(WindowsFormsHost)).GetMethod("NotifyActivateApp", BindingFlags.NonPublic | BindingFlags.Instance);
if (methodInfo != null)
{
     this.childGotFocus = Delegate.CreateDelegate(typeof(NotifyChildFocus), this, "NotifyActivateApp") as NotifyChildFocus;
}

Microsoft へのメモ: バグを修正していただきありがとうございます...既存のコードを壊さない方法で展開していただければ幸いです。

4

0 に答える 0