2010-05-10 11 views
7

istisnası yakalanamıyor. Tamam, bu kodun size tuhaf görüneceğini itiraf ediyorum ve bunun nedeni çünkü garip. Bu, sadece kullanmak istediğim kodu değil, davranışı yeniden üretmenin kodu.Activator.CreateInstance

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero }); 
     } 
     catch 
     { 
      Console.WriteLine("This won't print!"); 
     } 

     Console.Write("Actually this will not print either!"); 
     Console.ReadLine(); 
    } 
} 

olursa olsun yakalamaya çalışın neyi istisna tipi yürütmez catch bloğu içinde kodu (atılan gerçek istisna kadarıyla söyleyebilirim ArgumentException olan). Aslında yürütme, Activator.CreateInstance satırında durur.

+0

Bu yalnızca temsilciler oluşturulurken gerçekleşir mi? Bunun için 'Delegate.CreateDelegate' kullanmanız gerekiyor. –

+0

Muhtemelen delegeler oluşturulduğunda ancak bunun kullanıldığı gerçek kod, oluşturmaya çalıştıkları türden haberdar olmadığında gerçekleşir, şu andaki düzeltme, Temsilci'den devralma türünün bile denemesinin "yasak" olmasıdır. –

cevap

4

... Bu cevaptan çok soru getirir farkındayım. Etkileyici. Asıl aksilik çöp toplanan yığının bozulmasıdır, bir ExecutionEngineException ile belirtilir. Görünüşe göre hasar, CLR'nin istisna eylemcisini çalıştırmasını önlemek için yeterince kapsamlıdır.

Bunu, connect.microsoft.com adresinden bildirebilirsiniz. Ancak, hata, .NET 4.0'da giderilmiştir, uygun özel durum oluşturur, ArgumentNullException, "Değer, null olamaz, Parametre adı: yöntem". Geçici çözüm, boş olmayan bir dize beklediğinde IntPtr.Zero geçme, açıktır.

1

Bu kodu .NET 3.5'te çalıştırdığımda ExecutionEngineException olsun. Çalışma zamanı bu özel durumu atarsa, Environment.FailFast numaralı çağrıya benzer. Görünüşe göre bu, yığındaki bellek bozulma belirtisidir.

Örnek kodunuzu aşağı doğru değiştirdiğimde, doğru davranış sağlanır.

Activator.CreateInstance(
    typeof(Func<int>), 
    new object[] { IntPtr.Zero, new object() } 
); 

Ben O kodla CLR bombalanmış ettik :)

+0

İstisnaları yakalayamıyorum ve bunu hiç kontrol edemiyorum, bunun için ayarlarınız neler? –

+0

@Patrik - Hangi .NET sürümünü kullanıyorsunuz? – ChaosPandion

+0

3.5, VS 2008 kullanıyor. –

İlgili konular