2015-10-26 11 views
9

ich fast jedes Beispiel habe ich über Google finden konnte, und nicht die einfachste Aufgabe von nimWie eine nim DLL erstellen und es von nennen C#

Schaffung eines dll (Fenster) erreichen könnte

Kann mir jemand Schritt für Schritt erklären?

Ich verwende die nim IDE - aporia, um den Code zu produzieren.

Erfordert die Erstellung einer dll die Verwendung der Befehlszeile? Ich denke, es gibt einen Workaround.

mit aporia IDE \ command line, wie kann man das gleiche Ergebnis achive wie unten durch Kompilieren Code getan ein dll:

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

dass Code wie Sie wahrscheinlich wissen konnte von c#

+0

Versuchen Sie eine DLL von der NIM IDE zu erstellen? Versuchen Sie, NUM DLL-Funktionen von C# aufzurufen? Versuchst du beides zu tun? Es ist schwer zu sagen, was du geschrieben hast. – octopusgrabbus

+0

@octopusgrabbus danke für die Bearbeitung, du könntest auch den ganzen Weg übersetzen: Mission -> um einen Nim 'proc' Eintrag in einer DLL aufrufen zu können. Schritte zu ergreifen: man muss eine DLL erstellen. <--- –

+2

Ich bin kein Windows-Benutzer. Aber hast du http://stackoverflow.com/questions/32839321/how-to-correctly-create-a-nim-nimrod-windows-dll überprüft? Ich denke, das Vermeiden der Befehlszeile ist mit einer config.nim-Datei im selben Ordner wie Ihre Quelle möglich. Ich habe kein schrittweises Intro und würde auch nicht wissen, wie ich es von C# aus nennen soll. – OderWat

Antwort

4

Schritte genannt werden in Kurz:

  1. definieren Sie Ihre proc die Verwendung von Pragmas {.stdcall,exportc,dynlib.}
  2. Compile mit --app:lib

Denken Sie daran, dass Sie immer den generierten C-Code überprüfen, um zu sehen, was los ist. Also, lassen Sie uns mit einer Datei starten test.nim enthält:

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

Kompilieren dies mit nim c --app:lib -d:release test.nim erzeugt die DLL zusammen mit diesem Code (im nimcache Ordner):

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

Sie diese Makros in nimbase.h Nachschlag kann. Zum Beispiel N_LIB_EXPORT definiert ist wie für Windows folgt:

# 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) 

Insgesamt werden Sie genau die Funktion Signatur am Ende der Sie gegeben haben.

Wenn Sie nicht mithilfe der Befehlszeile kompilieren möchten, müssen Sie herausfinden, welche Aporia-Einstellungen --app:lib aktiviert.

+1

danke bluenot10, alles ist 1 = 1 zu dem, was Sie oben beschrieben haben, dll gefunden in den C# exe-Ordner kopiert und ... ich wollte sagen, dass es ein Problem gibt, als ich zuerst 'x86' versuchte, aber ** wenn kompiliert' x64' alles ist in Ordnung! ** ich denke nim standard kompiliert zu x64 Und es gibt '-Schalter' für x86 –

1

Übrigens, werfen Sie einen Blick auf diesen Thread aus dem Nim-Forum für einen wahrscheinlichen Grund, warum Ihre 32-Bit-Version nicht funktionierte.

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

Die kurze Version ist, dass MSVC Namen auf stdcall Funktionen auf 32-Bit-Plattformen werden von Mangeln, wenn Sie Maßnahmen ergreifen, dass (wie zB das Erstellen einer DEF-Datei die Namen der Funktionen zu definieren) außer Kraft zu setzen.

Verwandte Themen