2012-07-01 14 views
34

içine paketlenmelidir. Ben ayıklayıcıya içindeki .NET Framework 4 ile bu uyguladiinizdaSecurityException: eCall yöntemleri I aşağıdakine benzer bir (C#) işlevi vardır bir sistem modülünden

private static bool SpecialCase = false; 

public void Foo() 
{ 
    if (SpecialCase) 
    { 
     InternalMethod(); 
     return; 
    } 

    Console.WriteLine(); 
} 

[MethodImpl(MethodImplOptions.InternalCall)] 
private static extern void InternalMethod(); 

, yöntem başarıyla konsolu ve döner boş satır yazdırır. Ben ayıklayıcısını dışında çalıştırmak, o aşağıdaki iletiyle bir istisna atar:

System.Security.SecurityException: ECall methods must be packaged into a system module. 

O JIT derleyicisi (varsa) InternalMethod çağrıldığında aksine yöntemini derlediğinde istisnası atılır görünür. CLI'ye SecurityException'u atmamasını ya da yöntemin gerçekte aranana kadar istisnayı geciktirmesini söyleyebildiğim bir şey var mı (ör. Öznitelikler) var mı?

Kullanım durumuyla ilgili yan not: Microsoft .NET Framework ile çalışırken SpecialCase alanı etkili bir şekilde yanlıştır ve CLI'nin farklı (belirli) bir uygulamasında çalışırken doğrudur. Microsoft .NET Framework altında çalışırken, InternalMethod numaralı çağrı etkili bir şekilde erişilemiyor.

+0

normal bir yöntemle sarın miyim? – SLaks

+1

Evet, aşağıdaki gibi bir sarmalayıcı yöntemini çağırmanın istisnayı ortadan kaldırdığı anlaşılıyor. Olumsuz olan bu uygulama zaten karmaşık bir algoritmada daha da karmaşık kod yollarına yol açacaktır, bu yüzden bir tane bulunabiliyorsa daha temiz bir çözüm tercih ederim. özel statik boşluk InternalMethodWrapper() {InternalMethod(); } ' –

+0

BTW Bu' NET 4.5.2' ancak her iki çerçeveler içinde (her iki çerçeveler yine aynı 'CLR' vardır) sadece Release' Debug'' de, çalıştığınız düşünün vermedi 'in' Debug' modu da olur ? –

cevap

2

için [ComImport] bağlıyor. bir çalışma zamanı "eğer" seçeneğini kullanarak farklı olarak , bu her zaman koduna derlemek ve çok hangi (çalışma anında diyoruz belirlemek etmeye çalışmak yerine, çağrı hiç derlenmiş kod dahil edilip belirleyecek geç, analizinize dayanarak).

Kullanım durumunuz, bir sınama/doğrulama senaryosu gibi görünüyor; bu, dahili çağrının gerçekten yapılacağı durumlar dışında, kodun derlenmesine gerek duymadığınız anlamına gelir. kullanımınız durum bir non-.NET çalışma zamanını içeriyorsa, o ölçüde doğru cevabı değiştirebilir beri daha fazla bilgi sağlamak gerektiğini

Not.

İlgili konular