2010-11-13 26 views
7

VC++ dll yazdım.Dengesiz Stack!

extern "C" _declspec(dllexport) 
void startIt(int number) 
{ 
    capture = cvCaptureFromCAM(number); 
} 

g/Invoke P kullanılarak bir C# kodu bu DLL kullanımı aşağıdaki gibidir: DLL yöntemlerden biri için bildirimidir. Ben beyanda:

[DllImport("Tracking.dll", EntryPoint = "startIt")] 
     public extern static void startIt(int number); 

ve ben kodunda işlevini çağırır:

A call to PInvoke function 'UsingTracking!UsingTracking.Form1::startIt' has 
unbalanced the stack. This is likely because the managed PInvoke signature does 
not match the unmanaged target signature. Check that the calling convention 
and parameters of the PInvoke signature match the target unmanaged signature. 
: Bu satır karşılaşıldığında

Şimdi
startIt(0); 

, derleyici bana bu hatayı atıyor

Hem yönetilen hem de yönetilmeyen kodlardaki imzanın aynı olduğundan neden bu hatayı attığını anlayamıyorum. Üstelik, başka bir makinede, aynı kod görsel stüdyonda mükemmel çalışıyor. Yani, bu bana atılan hatanın yanlış yönlendirici olduğunu düşünmeme neden oluyor.

Lütfen

Yardım edin.

Teşekkür

+0

Makinelerinizden biri x86 ve diğer x64? –

+0

Hayır, her ikisi de x86'dır. Sadece bu bir Win7 ve diğer XP – Jayesh

cevap

13

Harici bir işlevi çağırdığınızda/çağırdığınızda, calling convention varsayılan değeri __stdcall olarak kullanılır. Fonksiyonun __cdecl kuralını kullandığından, bu tür olarak ilan etmek gerekir:

[DllImport("Tracking.dll", EntryPoint = "startIt", 
    CallingConvention = CallingConvention.Cdecl)] 
public extern static void startIt(int number); 
+0

Çalıştığınız için teşekkürler! Yine de, neden hala Win7 üzerinde çalışırken aynı hatayı atmadığını merak ediyorum! – Jayesh

+0

@James, Win7 doğru arama kuralı geçmek için sahnelerin arkasında özel sıhhi tesisat gerçekleştirmedikçe, sahip olmalıdır. –

+0

@James, Win7 üzerinde tam olarak aynısını kullandınız mı yoksa orada yeniden derlediniz mi? – Constantin

6

Eğer DllImport Özellikte CallingConvention=CallingConvention.Cdecl eksik olabilir mi?

+1

çalışır Bu sorun (örneğin, .NET 4'e geçtikten sonra) hata ayıklama yaparken benim sorun oldu. Bunu belirtmezseniz 'stdcall' varsayılantır! –

+0

Bu ayrıca, .NET 2'den .NET 4'e eski bir çözüm geçtikten sonra benim için de çözdü. –

4

Constantin ve Frederic Hamidi bu sorunu çözmek için nasıl olarak bu soruyu doğru yanıtladım. Bu, bir nihai yığının taşmasını önlemeye yardımcı olabilir. Bu defalarca kendim ısırdım. Burada gerçekten oynamakta olan şey, .NET 4'ün hatalı bir p/invoke çağrısını denetleyen 32 bit x86 makinelerinde (64 bit değil) hata ayıklama (sürüm değil) için yönetilen bir hata ayıklama yardımcısını etkinleştirmiş olmasıdır. Bu MSDN makalesi şu ayrıntılar: http://msdn.microsoft.com/en-us/library/0htdy0k3.aspx. Stephen Cleary bu yazıyı tanımlamak için krediyi hak ediyor: pinvokestackimbalance -- how can I fix this or turn it off?

İlgili konular