Мы столкнулись с некоторыми странными вещами при вызове отраженных обобщенных делегатов.В некоторых случаях с привязанным отладчиком мы можем сделать невозможный вызов, в то время как без отладчика мы не можем перехватить любые исключения и fastfails приложения.
Вот код:
using System;
using System.Windows.Forms;
using System.Reflection;
namespace GenericDelegate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private delegate Class2 Delegate1();
private void button1_Click(object sender, EventArgs e)
{
MethodInfo mi = typeof (Class1<>).GetMethod("GetClass", BindingFlags.NonPublic | BindingFlags.Static);
if (mi != null)
{
Delegate1 del = (Delegate1) Delegate.CreateDelegate(typeof (Delegate1), mi);
MessageBox.Show("1");
try
{
del();
}
catch (Exception)
{
MessageBox.Show("No, I can`t catch it");
}
MessageBox.Show("2");
mi.Invoke(null, new object[] {});//It's Ok, we'll get exception here
MessageBox.Show("3");
}
}
class Class2
{
}
class Class1<T> : Class2
{
internal static Class2 GetClass()
{
Type type = typeof(T);
MessageBox.Show("Type name " + type.FullName +" Type: " + type + " Assembly " + type.Assembly);
return new Class1<T>();
}
}
}
}
Есть две проблемы:1006 *
- Поведение отличается с отладчиком и без
- Вы не можете поймать эту ошибку без отладчика с помощью трюков clr.Это просто не исключение.Есть доступ к памяти, чтение нулевого указателя внутри внутреннего кода.
Вариант использования: Вы разрабатываете что-то вроде системы плагинов для своего приложения.Вы читаете внешнюю сборку, находите подходящий метод в каком-то виде и выполняете его.И мы просто забыли о том, что нам нужно проверить, является ли тип универсальным или нет.Под VS (и .net от 2.0 до 4.0) все отлично работает.Вызываемая функция не использует статический контекст универсального типа и параметров типа.Но без VS приложение не работает без звука.Мы даже не можем идентифицировать отладчик, присоединяющийся к стеку вызовов.
Протестировано с .net 4.0
Вопрос в том, почему VS ловит, а среда выполнения не делает?