2011-02-08 13 views
8

CDecl geri çağrıları olan bir c kitaplığım var. Bunları C# 'dan nasıl kullanabilirim?pinec ile cdecl geri çağırma nasıl kullanılır

Herşey onların stdcall geri aramaları

olması gerektiğini söylemek gibi görünüyor açık olmak: del .NET 2.0, kullanım ile

+0

sen (yönetilmeyen kod çağırabilir yani 'Cdecl' fonksiyonu) C# bir' Cdecl' geri arama yaratmaya çalıştığını, yoksa sen C# gelen yönetilmeyen (yani yerli C) 'Cdecl' işlevini aramak için çalışıyoruz? –

cevap

14

Buna bir bakın. İşlev 1.1'den beri olmuştur, bu yüzden hangi .NET sürümünü kullanıyor olmalısınız. Sadece CallingConvention'ı belirtmelisiniz.

CallingConvention Documenation at MSDN

Ayrıca Kod Projesi bu makalede bakabilirsiniz:

Using the _CDECL calling convention in C#

EDIT: Ayrıca, İşte FreeImage.NET bir örnektir.

static FreeImage_OutputMessageFunction freeimage_outputmessage_proc = NULL; 
DLL_API void DLL_CALLCONV 
FreeImage_SetOutputMessage(FreeImage_OutputMessageFunction omf); 

Sonra sadece C# tarafında, tarih:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
public delegate void FreeImage_OutputMessageFunction(FREE_IMAGE_FORMAT 
format, string msg); 

[DllImport(dllName, EntryPoint="FreeImage_SetOutputMessage")] 
public static extern void SetOutputMessage(FreeImage_OutputMessageFunction 
omf); 
+0

awesome - teşekkürler - tam ihtiyacım olan şey – pm100

-1
  1. Derleme cdecl-bilge çağrılmalıdır

    delegate int del(); 
    [dllimport("mylib.dll",CallingConvention=CallingConvention.Cdecl)] 
    public static extern int funcwithcallback(del foo); 
    

    2005 derleyici !!

  2. Bağımsız değişken yönünü tersine çevirin.

2005 derleyici tarafından eklenen bazı koruma kodu nedeniyle çalışır.

DÜZENLEME: Yerel kodda bir çerçeve oluşturabilirseniz bunu denemeyin.

+1

Parametre sırasından daha fazla 'cdecl' var. 'StdCall' aranan işlevi yığınının temizlenmesini beklerken, 'Cdecl' arayanı yığınının temizlemesini bekler. Çağrı kurallarının karıştırılması yığın dengesizliğine yol açacaktır. –

+0

@Jim: Bunu biliyorum. Kazayla keşfettim 2005 derleyicisinde, marshalling'de fixup mantığı bulunuyor. 2010 derleyicisine geçtiğimde işe yaramadı ve nedenini anlatan bir zamanım vardı. – Joshua