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