Сделав не что иное, как установку Visual Studio 2012, наше существующее приложение теперь вылетает при попытке создать делегат.
Почему мы должны получать эту ошибку при запуске нашего приложения (не работает в отладке... просто запускаем .exe нормально... не перекомпилировав или не сделав ничего, кроме установки 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;
}
}
UPDATE: Обнаружено, что метод NotifyActiveateApp больше не существует в WindowsFormsHost. Я не понимаю, как установка .net 4.5 с visual studio 2012 повлияла на мое существующее приложение 4.0.
UPDATE: чтобы обойти это, я использовал отражение, чтобы проверить, существует ли метод 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: спасибо за исправление вашей ошибки... Я просто хочу, чтобы вы развернули ее таким образом, чтобы не нарушить существующий код.