2015-10-26 14 views
9

Znam prawie każdy przykład udało mi się znaleźć za pośrednictwem google, i nie mógł wykonać najprostsze zadanie tworząc dll (Windows)z nimJak stworzyć dll NIM i wywołać ją od C#

Czy ktoś mógłby wyjaśnić to krok po kroku?

Używam nim IDE - aporia produkować kod.

Czy budowa dll wymaga użycia wiersza poleceń? Chyba istnieje obejście.

użyciu aporia IDE \ command line, jak można achive taki sam wynik jak zrobić kompilując kod poniżej do dll:

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

że kod jak zapewne wiesz można nazwać od c#

+0

Czy próbujesz utworzyć bibliotekę DLL z NIM IDE? Czy próbujesz wywołać funkcje NUM DLL z C#? Czy próbujesz zrobić obie te rzeczy? Trudno powiedzieć z tego, co napisałeś. – octopusgrabbus

+0

@octopusgrabbus dzięki za edycję, możesz równie dobrze przejść całą drogę do przetłumaczenia: mission -> to (be able) wywołać w nim wpis 'proc' w bibliotece DLL. kroki do podjęcia: trzeba stworzyć bibliotekę dll. <--- –

+2

Nie jestem użytkownikiem systemu Windows. Ale czy sprawdziłeś http://stackoverflow.com/questions/32839321/how-to-correctly-create-a-nim-nimrod-windows-dll? Domyślam się, że omijanie wiersza poleceń jest możliwe z plikiem config.nim w tym samym folderze, co twoje źródło. Nie mam jednak wstępu krok po kroku i nie wiedziałbym, jak to nazwać z C# w ogóle. – OderWat

Odpowiedz

4

Kroki w podsumowanie:

  1. Zdefiniuj swój proces za pomocą pragmy {.stdcall,exportc,dynlib.}
  2. skompilować z --app:lib

Pamiętaj, że zawsze możesz sprawdzić wygenerowany kod C, aby zobaczyć co się dzieje. Więc zacznijmy pliku test.nim zawierającego:

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

Kompilacja ta z nim c --app:lib -d:release test.nim produkuje DLL wraz z tym kodem (w folderze nimcache):

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

Można odnośnika tych makr w nimbase.h. Na przykład N_LIB_EXPORT jest zdefiniowana w następujący sposób dla systemu 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) 

Ogólnie rzecz biorąc, można skończyć z dokładnie podpisu funkcji dałeś.

Jeśli nie chcesz kompilować za pomocą wiersza poleceń, musisz dowiedzieć się, które ustawienia Aporii umożliwiają --app:lib.

+1

dziękuję bluenot10, wszystko jest 1 = 1 do tego, co opisałeś powyżej, dll znalezione skopiowane do folderu C# exe i ... miałem zamiar powiedzieć, że jest problem, ponieważ najpierw próbowałem 'x86' ale ** po kompilacji' x64' wszystko jest w porządku! ** domyślam się, że nim domyślnie kompiluje się do x64 I jest '-switch' na x86 –

1

Przy okazji, spójrz na ten wątek z forum Nim z prawdopodobnego powodu, dla którego twoja wersja 32-bitowa nie działa.

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

Krótka wersja jest taka, że ​​MSVC ma nazwę przekręcona o funkcjach stdcall na 32 bitowych platformach chyba podjąć kroki, aby zastąpić to (takich jak stworzenie pliku .def zdefiniowanie nazwy funkcji).

Powiązane problemy