2009-09-14 15 views
7

C# içinde PInvoke kullanmayı öğrenmek için bir girişimde, basit değerler türlerini içeren işaretçilerle çeşitli durumların nasıl ele alınacağından emin değilim.İşaretçiler dahil olduğunda P/Invoke nasıl

Bir yönetilmeyen DLL aşağıdaki iki işlevi içe ediyorum:

public int USB4_Initialize(short* device); 
public int USB4_GetCount(short device, short encoder, unsigned long* value); 

ilk fonksiyon bir giriş, bir çıkış olarak, ikinci olarak işaret kullanır. Onların kullanımı C++ oldukça basittir:

// Pointer as an input 
short device = 0; // Always using device 0. 
USB4_Initialize(&device); 

// Pointer as an output 
unsigned long count; 
USB4_GetCount(0,0,&count); // count is output 

aşağıdaki P/C# sonuçlarında Benim ilk girişimi çağırır: Ben aynı şekilde C# bu işlevleri nasıl kullanırım

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(IntPtr deviceCount); //short* 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, IntPtr value); //ulong* 

Yukarıdaki C++ kodu?MarshalAs kullanarak bu türleri bildirmenin daha iyi bir yolu var mı? işaretçi tek basit tür ve bir dizi ise

+0

Hey USB 4 zaten? Hâlâ 3.0 –

+1

için bekliyorum. USB4 ile ilgisi yok. Bu, şirketin bir kodlayıcıya bağlanmak için sahip olduğu bir USB aygıtıdır ve ürününün 4. revizyonu olduğundan, aptalca USB4 ürününü adlandırmışlardır. –

cevap

12

, muhtemelen daha uygundur, bu örneklerde üzerinden de parametresini

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(ref short deviceCount); 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref uint32 value) 

açıklamak için ref/kullanmaya ama ya çalışacaktır.

+0

Yani GetCount() 'da ref yerine kullanabilir miyim? –

+0

Anlıyorum, bu tam olarak ne için umuyordum. Teşekkürler. –

+0

Yep, USB4_GetCount tanımında olmayanlar dışında aynı şeyi söyleyecekti. – zebrabox

0

.NET çalışma zamanı, sizin için çok fazla dönüşüm yapabilir ("marshaling" olarak anılacaktır). Açık bir IntPtr, her zaman anlattığınız gibi EXACTLY yapacak olsa da, ref anahtar kelimesini bunun gibi bir işaretçi için kullanabilirsiniz.

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(ref short deviceCount); //short* 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref short value); //ulong* 

Daha sonra, bu gibi onları arayabilirsiniz:

short count = 0; 

USB4_Initialize(ref count); 

// use the count variable now.