Aracılığıyla paylaş


PInvokeStackImbalance MDA

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

PInvokeStackImbalance Yönetilen hata ayıklama yardımcısı (MDA), CLR, bir platform çağrısından sonra yığın derinliğinin, öznitelikte belirtilen çağrı kuralı ve yönetilen imzadaki DllImportAttribute parametrelerin bildirimi göz önünde bulundurularak beklenen yığın derinliğiyle eşleşmediğini algıladığında etkinleştirilir.

PInvokeStackImbalance MDA yalnızca 32 bit x86 platformları için uygulanır.

Not

PInvokeStackImbalance MDA varsayılan olarak devre dışıdır. Visual Studio 2017 ve sonraki sürümlerde MDA, PInvokeStackImbalance Özel Durum Ayarları iletişim kutusundaki Yönetilen Hata Ayıklama Yardımcıları listesinde görünür (Windows>Özel Durum Ayarlarında Hata Ayıkla'yı>seçtiğinizde görüntülenir). Ancak, Oluşturulurken Kes onay kutusunun seçilmesi veya temizlenmesi MDA'yı etkinleştirmez veya devre dışı bırakmaz; yalnızca MDA etkinleştirildiğinde Visual Studio'da özel durum oluşturup oluşturmayacağını denetler.

Belirtiler

Bir uygulama, bir platform çağırma çağrısı yaparken veya bu çağrıyı takip ederken erişim ihlali veya bellek bozulmasıyla karşılaşır.

Neden

Platform çağırma çağrısının yönetilen imzası, çağrılan yöntemin yönetilmeyen imzası ile eşleşmeyebilir. Bu uyuşmazlık, yönetilen imzanın doğru sayıda parametre bildirmemesi veya parametreler için uygun boyutu belirtmemesi olabilir. MDA, büyük olasılıkla özniteliği tarafından DllImportAttribute belirtilen çağırma kuralı yönetilmeyen çağırma kuralıyla eşleşmediğinden de etkinleştirilebilir.

Çözüm

Yerel hedefin imza ve çağırma kuralıyla eşleşip eşleşmediğinden emin olmak için yönetilen platformu çağırma imzasını ve çağırma kuralını gözden geçirin. Hem yönetilen hem de yönetilmeyen taraflarda çağırma kuralını açıkça belirtmeyi deneyin. Yönetilmeyen işlevin yönetilmeyen derleyicideki bir hata gibi başka bir nedenle yığını dengesiz hale getirmesi de mümkündür.

Çalışma Zamanı üzerindeki etkisi

Tüm platform çağrılarını CLR'de iyileştirilmemiş yolu almaya zorlar.

Çıktı

MDA iletisi, yığın dengesizliğine neden olan platform çağırma yöntemi çağrısının adını verir. Bir SampleMethod platform çağırma yönteminin örnek iletisi:

'SampleMethod' PInvoke işlevine yapılan çağrı yığının dengesizliğiyle karşılandı. Bunun nedeni büyük olasılıkla yönetilen PInvoke imzasının yönetilmeyen hedef imzayla eşleşmemesidir. PInvoke imzasının çağrı kuralının ve parametrelerinin hedef yönetilmeyen imzayla eşleşip eşleşmediğini denetleyin.

Yapılandırma

<mdaConfig>
  <assistants>
    <pInvokeStackImbalance />
  </assistants>
</mdaConfig>

Ayrıca bkz.