2015-10-26 16 views
9

Ho letto quasi tutti gli esempi che ho trovato tramite google, e non poteva realizzare il compito più semplice creazione di un dll (finestre)da nimCome creare una DLL NIM e lo chiamano da C#

Qualcuno potrebbe spiegarlo passo dopo passo?

Sto usando il nim IDE - aporia per produrre il codice.

La creazione di un dll richiede l'utilizzo della riga di comando? Immagino che ci sia una soluzione alternativa.

utilizzando aporia IDE \ command line, come si può achive lo stesso risultato di fatto mediante la compilazione di codice sottostante per un dll:

extern "C" __declspec(dllexport) int __stdcall return_multiply(int num1, int num2) 
{ 
    return num1 * num2; 
} 

che codice come probabilmente sapete potrebbe essere chiamato da c#

+0

Stai cercando di creare una DLL dall'IDE NIM? Stai cercando di chiamare le funzioni NUM NUM da C#? Stai provando a fare entrambe queste cose? È difficile capire da quello che hai scritto. – octopusgrabbus

+0

@octopusgrabbus grazie per la modifica, si potrebbe anche andare fino in fondo tradurlo: mission -> to (essere in grado) chiama una voce noma 'proc' in una dll. passi da compiere: è necessario creare una dll. <--- –

+2

Non sono un utente di Windows. Ma hai consultato http://stackoverflow.com/questions/32839321/how-to-correctly-create-a-nim-nimrod-windows-dll? Immagino che evitare la riga di comando sia possibile con un file config.nim nella stessa cartella della tua fonte. Non ho intro passo dopo passo e anche non saprei come chiamarlo da C# a tutti. – OderWat

risposta

4

Passi in poche parole:

  1. definire il tuo proc utilizzando i pragma {.stdcall,exportc,dynlib.}
  2. Compila con --app:lib

Ricorda che puoi sempre ispezionare il codice C generato per vedere cosa sta succedendo. Quindi, cominciamo con un file test.nim contenente:

proc return_multiply(num1, num2: int): int {.stdcall,exportc,dynlib.} = 
    num1 * num2 

compilazione questo con nim c --app:lib -d:release test.nim produce la DLL con questo codice (nella cartella nimcache):

N_LIB_EXPORT N_STDCALL(NI, return_multiply)(NI num1, NI num2) { 
     NI result; 
     result = 0; 
     result = (NI)(num1 * num2); 
     return result; 
} 

si può cercare queste macro in nimbase.h. Per esempio N_LIB_EXPORT è definito come segue per Windows:

# ifdef __cplusplus 
# define N_LIB_EXPORT extern "C" __declspec(dllexport) 
# else 
# define N_LIB_EXPORT extern __declspec(dllexport) 
# endif 
# define N_LIB_IMPORT extern __declspec(dllimport) 

Nel complesso, si finirà con esattamente la funzione di firma avete dato.

Se non si desidera compilare utilizzando la riga di comando, è necessario capire quali impostazioni di Aporia abilitano --app:lib.

+1

grazie bluenot10, tutto è 1 = 1 per quello che hai descritto sopra, dll trovato copiato nella cartella C# exe e ... stavo per dire che c'è un problema come ho prima provato 'x86' ma ** quando compilato' x64' ogni cosa va bene! ** Immagino compili di default di nim a x64 E c'è '-switch' per x86 –

1

A proposito, dare un'occhiata a questo thread dal forum Nim per un probabile motivo per cui la tua versione a 32 bit non funzionava.

http://forum.nim-lang.org/t/1721

La versione breve è che MSVC fa nome pressare sulle funzioni stdcall su piattaforme a 32 bit a meno che non si prendano misure per ignorare che (come ad esempio la creazione di un file DEF per definire i nomi delle funzioni).

Problemi correlati