2010-06-25 17 views
11

Esiste uno sportello unico per determinare quali tipi/attributi .NET utilizzare, dato un tipo nativo?Come sapere quale tipo usare marshall da P/Invoke?

esempio potrebbe essere simile a questa:

Native Type | .NET Type 
--------------------------------------- 
    int   | Integer 
    int*   | IntPtr (or is it ref int?) 
    LPCSTR   | [MarshalAs(UnmanagedType.LPStr)]String 
    ... 

Guidelines for custom structures: 
    ... 

Inoltre, come legati a parte, qual è il luogo più affidabile per la ricerca di dichiarazioni di smistamento per Win32 funzioni?

risposta

8

pinvoke.net è una grande risorsa per le firme di funzioni win32. In caso contrario, è necessario esaminare i file di inclusione di C/C++ per capire la convenzione e gli argomenti di chiamata. Le strutture complesse sono un po 'più difficili, ma il modo più semplice è di solito dichiarare la struttura in C# usando l'attributo StructLayout su di esso per assicurarsi che tutti i campi siano allineati.

Non sono a conoscenza di una singola risorsa onnicomprensiva per fare ciò (ciò non significa che non esiste, solo che non ne so nulla) ma ci sono molte informazioni su MSDN riguardo a questo.

+0

che risponde alla parte, ma per quanto riguarda la domanda? Il motivo per cui lo chiedo è che ho bisogno di P/Richiamare alcune funzioni da dll interni. –

+0

Rispondo solo a parte. Bene, ok, ho modificato la mia risposta. –

1

Un altro strumento pinvoker per Visual Studio

http://www.pinvoker.com/

E un altro strumento che converte un dato insieme non gestito di file e genera una DLL gestita:

http://www.paulyao.com/res/pinvoke/pinvoke.aspx

Infine, se si don Non voglio scaricare alcun tool puoi sempre fare riferimento al riferimento online di pinvoke.net per tutte le librerie non gestite per ottenere il pinvoke/marshal come definizioni:

http://www.pinvoke.net/default.aspx/kernel32.waitforsingleobject

1

Mi piace la interop assistant. Dagli la tua dichiarazione (di funzione o di tipo - hai bisogno del tipo se è un parametro per la funzione) e ti dà il codice VB o C#.