2010-10-10 15 views
5

bir dll aşağıdaki fonksiyonları şöyle oldu C# dan bu işlevleri kullanmakPlatform Çağırma, bool, ve dize

extern "C" __declspec(dllexport) void f(bool x) 
{ 
    //do something 
} 
extern "C" __declspec(dllexport) const char* g() 
{ 
    //do something else 
} 

Benim ilk naif bir yaklaşım içerdiğini düşünelim C++ bool C# bool (garip çalışma zamanı davranışı, ancak hiçbir çöker, ancak) dönüşmez. Bu yüzden bool'u bayt olarak değiştirmek ve el ile diğerine dönüştürmek zorunda kaldım. Yani, ilk soru, bool marşalmak için daha iyi bir yolu var (bu BOOL değil, bool olduğunu unutmayın)

İkinci sürpriz, dll işlevi tarafından döndürülen işlenmemiş dizenin C# dizesi tarafından kopyalanmış olmasıydı, kopyalanamadı beklediğim gibi ve sonunda C# kodu dll tarafından döndürülen belleği serbest bırakır. Program çöktüğü için bunu buldum, ancak dönüş türünü sbyte * olarak değiştirdim ve el ile kopyayı zaten yapan işaretçiyi elle başlattım. Yani ikinci soru şu: 2.1: İşaretlenmiş dizgenin işaretçiye sahip olmasını engellemenin daha iyi bir yolu var mı? 2.2: WTF ?! C# neden böyle yapıyor? Dll func bir literal döndürdüğünde ve C# bunu denediğinde bariz bir durum var demektir ...

Şimdiden teşekkürler ve umarım sorularım muğlak değil ya da anlaşılmaz.

cevap

5
[DllImport("MyDll.dll")] 
internal static extern void f([MarshalAs(UnmanagedType.I1)] bool x); 
[DllImport("MyDll.dll")] 
[return: MarshalAs(UnmanagedType.LPStr)] 
internal static extern string g(); 
5

Varsayılan olarak, .NET otomatik olarak C++ BOOL (4 bayt) ve .NET bool türü arasında geçiş yapar. C++ bool (tek bayt) için yazmaya başlamadan önce sıralamakta belirtmek gerekir:

[DllImport("MyDll.dll")] 
internal static extern void f([MarshalAs(UnmanagedType.I1)] bool x); 
+0

@Darin: İşin komik Arkadaşlarımdan biri ne tahmin bana aynı şeyi söyledi ve edilir? Işe yaramadı. Eğer bu –

+1

ile alakalı ise Net1.1 kullanıyorum. Aslında bu 1.1'den destekleniyor. buraya bakın http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype(v=VS.71).aspx – Vinzenz

+0

@Armen belgelere göre çalışmalıdır. –

İlgili konular