2016-03-23 23 views
0

Yerel C++ DLL dosyasını bir C# DLL dosyasına dönüştürüyorum. C/C++ 'da pek kabul görmedim, ancak bu sorun üzerinde sıkışıp kalana kadar çalışmayı başardım. İşte çok basit kod örnek:C# P/Invoke: yerel çıkış parametresi değeri yönetilen kodlara ulaşmaz

C++

C#

[DllImport("ProAsaNativeDll.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void outTest(ref int number); 

public static int OutTest() 
{ 
    int number = 2; 
    outTest(ref number); 
    return number; //number = 2 
} 

benim gerçek senaryo olduğumu fark edin, bu bir işaretçi ile çalışmak için almaya çalışıyorum

PROASADLL __declspec(dllexport) void outTest(int* number){ 
    int temp = *number + 10; 
    number = &temp; //*number = 12 
} 

struct için işaretçi ama ben bir marshalling sorun olarak dışarıda bırakmaya karar verdim; Bu basit kod bile işe yaramaz. C++ kodu işe yarıyor ama ben aptallık ve orada bir problem yaşamaya karar vermezdim: dediğim gibi çok C/C++ bilmiyorum.

C# sarmalayıcı yöntemindeki sayı değişkeni değeri değişmeyecektir. Lütfen yardım et.

+2

Kötü C++ kodu. Bu onu sıkarken daha iyi olmaz. Önce bir C++ test programından çalışmasını sağlayın. –

cevap

2

Kötü bir sonuç aldığınızı düşünüyorum çünkü C++ kodunuzda, başka bir işaretçiye ayarlayarak number parametresini değiştiriyorsunuz.

Değişikliğinizin yalnızca outTest kapsamındaki işlevinizde görülebileceğine inanıyorum.

Ancak, işaretçinin bulunduğu noktayı değiştirirseniz ... bu farklı bir hikaye olmalı. Bunun gibi:

DÜZENLEME: Bu bit sınanmamıştır. Ah ... ve ayrıca ... C++'da yaş için hiçbir şey yazmadım. Tamamen yanlış olabilir.

+0

Bisiklete binmek gibi – Jacobr365

+1

@ Jacobr365 Evet ... Hepsi iyi ve düzgün ... Düşene ve burnunu kırana kadar :) –

+0

Güzel! Dediğim gibi, C++ benim forte'm değil, hem "ne yaptın" hem de yanlış olduğumu görüyorum. Çok teşekkürler! – makoshichi

İlgili konular