» »

[C#] in DLL-ji

[C#] in DLL-ji

ql000 ::

Spet jaz in DLL-ji!

Dll-je, ki vsebujejo funkcije kot so:
int TestSum(int input1, int input2)
že znam manipulirat, vstavi se mi pa pri funkcijah, ki vsebujejo kazalce.

primer funckije v C++, ki bi jo rad uporabljal v C#:
long ScalarFun(float scalar_input, float *scalar_output)
, pri čemer funkcija vrne 0, če je vnešena cifra > 0 in -2, če je cifra < 0.

V C# kličem ustrezen dll tako (unsafe imam vklopljen):
[DllImport(@"C:\Documents and Settings\Igor\My Documents\playground\dll\simpledll\Debug\simpledll.dll", EntryPoint = "ScalarFun", ExactSpelling = true, CharSet = CharSet.Ansi)]
        
public static extern Int16 ScalarFun(float input1, out IntPtr input2);

static void Main(string[] args)
        {
            int Vsota;
            Int16 status;

            System.Console.WriteLine("Test 1. DLL funkcije...\n");

            Vsota = TestSum(22,99);

            System.Console.WriteLine("Vsota : {0}", Vsota);

            System.Console.WriteLine("\nTest 2. DLL funkcije... \n");

            IntPtr target = IntPtr.Zero;
            
            status = ScalarFun(10000000, out target);

            System.Console.WriteLine("Vrnjen status: {0}", status);
            System.Console.WriteLine("Vrnjena vrednost {0}: ", target);



status dobim v redu, samo vrednost target pa nikakor! Po mojem je finta v definiciji spremenljivk, samo kaj ko nikjer ni varijante FloatPtr :(!

Kake ideje?

Kekec ::

poizkusi malo drugace
public static extern long ScalarFun(float input1, out Single input2);

ql000 ::

Dela! Hvala Kekec!!

ql000 ::

A ima kdo kak link na stran, kjer bi bili ti prehodi, posebej spremembe pri tipih spremenljivk zbrane na enem koncu, v kakšni knjigi,..?

Kekec ::

JE v MSDN-ju, ampak nevem točno kje, saj veš kako je velik!

grandioso74 ::

Imam podobno situacijo, kjer je pa zraven še ločen header file. Sicer dobim error
System.EntryPointNotFoundException: 'Unable to find an entry point named 'getSctructSum' in DLL 'ScructureHandler.dll'.'
trenutno imam funkcijo vključeno:
[DllImport("ScructureHandler.dll", CallingConvention = CallingConvention.Cdecl)], podpis v C-ju pa je getStructSum(TSruct * struct, int numberOfStruct);
.
Človek je sam svoj največji sovražnik.

gozdar1 ::

C++ funkcije morajo biti eksportane kot C.

darkolord ::

Pa zatipkal si se:
getSctructSum
getStructSum

grandioso74 ::

gozdar1 je izjavil:

C++ funkcije morajo biti eksportane kot C.

Saj to je C funkcija

darkolord je izjavil:

Pa zatipkal si se:
getSctructSum
getStructSum

Mislim, ja ok....ampak ni to fora, VS že javi to.
Človek je sam svoj največji sovražnik.

Vesoljc ::

dej pokazi header
Abnormal behavior of abnormal brain makes me normal...

133127 ::

extern "C" ... sicer bos trpel od dekoracij. Vzami depends (vsaj vcasih si ga dobil zraven visual studia) in poglej dll kot kaj je exportana funkcija.

Razen tega, tisto strukturo TSruct zgoraj bos moral sam interpretirat (je pa res, da ne poznam C#, mogoce se da kaj zmutit z managed C++ funkcijo.

Sicer se pa com objekt iz tega naredi, pa uporabljaj tisto.

Zgodovina sprememb…

  • spremenilo: 133127 ()

grandioso74 ::

__declspec(dllexport) int getStructSum(TSruct * struct, int numberOfStruct);
kaj drugega posebnega ni.
.
Človek je sam svoj največji sovražnik.

googleg1 ::

Ce uporabljas c++ compiler moras narediti se extern C. Drugace bos dobil name mangling.

EDIT: Vidim da je ze predhodnik isto komentiral

Zgodovina sprememb…

  • spremenil: googleg1 ()

gozdar1 ::

Plus moraš definirat pravi calling convention bodisi pri exportu bodisi v DllImport atributu.

grandioso74 ::

133127 je izjavil:

extern "C" ... sicer bos trpel od dekoracij. Vzami depends (vsaj vcasih si ga dobil zraven visual studia) in poglej dll kot kaj je exportana funkcija.

Razen tega, tisto strukturo TSruct zgoraj bos moral sam interpretirat (je pa res, da ne poznam C#, mogoce se da kaj zmutit z managed C++ funkcijo.

Sicer se pa com objekt iz tega naredi, pa uporabljaj tisto.

Še vedno ne vem, kaj bi lahko
tale error izzvalo?
System.EntryPointNotFoundException: 'Unable to find an entry point named 'getCalculation' in DLL 'Kalkulator.dll'.'
Pač vzel sem ene druge funkcije kjer sta parametra, float * array, int length in je isto. dajmo vzeti drugo funkcijo, da bo lažje
Človek je sam svoj največji sovražnik.

Zgodovina sprememb…

  • spremenil: ahac ()

acookook ::

Za DLL-e boš najlažje vidu s kakim DLL viewerjem, kot ne npr. dependency walker al pa kakšen DLL export viewer, mogoče celo to https://github.com/lucasg/Dependencies pol pa samo tam prebereš entry point.
.

gozdar1 ::

To verjetno pomeni da funkcije s tem imenom ni v dll.

grandioso74 ::

Sem odprl tale dll in ne boš verjel, funkcija je celo notri.

Nisem še probal sicer jo vključiti. Bomo probali.
Človek je sam svoj največji sovražnik.

Zgodovina sprememb…

gozdar1 ::

Sice pa vedno imaš LoadLibrary opcijo.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] naloga za maturo...rabim majhno pomoc

Oddelek: Programiranje
192357 (1694) ql000
»

C# in slika iz kamere

Oddelek: Programiranje
61371 (1255) ql000
»

[C#] Sesutje aplikacije

Oddelek: Programiranje
111645 (1480) Jean-Paul
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112160 (2035) Zzzzzzz
»

[.NET ali c#] ne najdem dokumentacije

Oddelek: Programiranje
81483 (1329) atasmrk

Več podobnih tem