Forum » Programiranje » c++ lib,dll,h za uporabo v C#
c++ lib,dll,h za uporabo v C#
duks ::
Pozdravljeni
Znasel sem se v tezavah :(
Imam c++ lib ,.h in dll file ki bi jih zelel uporabiti v c# aplikaciji ki jo razvijam. Problem je da c++ ne znam niti malo in sem se tako znasel v precejsni zagati. Nasel sem neke stvari na netu, ki mi pravijo da bi moral narediti Managed C++ DLL katerega bi nato lahko klical iz c# no tu pa se mi zaenkrat tudi ustavi
Je mogoce kje kdo s toliko znanj ki bi mi za nekaj 10€ nagrade bil pripravljen pomagati
lp
Znasel sem se v tezavah :(
Imam c++ lib ,.h in dll file ki bi jih zelel uporabiti v c# aplikaciji ki jo razvijam. Problem je da c++ ne znam niti malo in sem se tako znasel v precejsni zagati. Nasel sem neke stvari na netu, ki mi pravijo da bi moral narediti Managed C++ DLL katerega bi nato lahko klical iz c# no tu pa se mi zaenkrat tudi ustavi
Je mogoce kje kdo s toliko znanj ki bi mi za nekaj 10€ nagrade bil pripravljen pomagati
lp
dadada
BlueRunner ::
Tudi ceneje
Kje točno se ti je zataknilo? Ali imaš tako malo znanja C++, da ne znaš niti razreda sestaviti, ali pa si ta korak že opravil?
Kje točno se ti je zataknilo? Ali imaš tako malo znanja C++, da ne znaš niti razreda sestaviti, ali pa si ta korak že opravil?
BlueRunner ::
Uf... poglej si malo povezave pri c++. Sintaksa je dokaj podobna C# (oziroma obratno) tako, da ne bi smel imeti preveč težave z branjem.
#include je za uvoz deklaracij (nekaj takšnega kot using)
Instance se ravno tako ustvarja z "new", samo na konccu ne smeš pozabiti še na "delete". C++ ne bo za teboj ničesar sam pospravljal.
Razne tutoriale, ki na dolgo in široko pišejo o cout, cin, ... in podobnih stvareh pa lahko mirno izpustiš. Za tvojo težavo so to nepomembne knjižnice.
#include je za uvoz deklaracij (nekaj takšnega kot using)
Instance se ravno tako ustvarja z "new", samo na konccu ne smeš pozabiti še na "delete". C++ ne bo za teboj ničesar sam pospravljal.
Razne tutoriale, ki na dolgo in široko pišejo o cout, cin, ... in podobnih stvareh pa lahko mirno izpustiš. Za tvojo težavo so to nepomembne knjižnice.
KaRkY ::
Poglej si DllImport atribut v C#. Mogoče ti bo s tem lažje kot pa Managed C++ ki je za mene zmeda:).
When you look long into an abyss, the abyss looks into you
noraguta ::
kaj preprostega se da prevest z managed c++ , kaj kompleksnejšega pa že zahteva več predeelave same kode kot , če prevedeš v native ter marshalaš struture ter metode v managed world. po mojih izkušnjah. ni pa nobena stvar prav preprosta.
Pust' ot pobyedy k pobyedye vyedyot!
BlueRunner ::
DllImportAttribute je uporaben za uvoz "navadnih" funkcij, ne pa C++ razredov. Če imaš razrede so ti v prevedeni objektni kodi okrašeni (decorated), pa še svojo interno knjigovodstvo iz standardne C++ knjižnice morajo zganjati.
Če želiš uporabiti obstoječo C++ knjižnico (s C++ razredi) je edini način, da narediš ovoj (wrapper) v mC++, nato pa v .NET uporabljaš metode preko tega ovoja. Samo po sebi je to sicer res dolgočasno delo, nikakor pa to ne pomeni, da je potrebna kakšna huda predelava. Ravno izdelava ovoja je tisto, kar ti predelavo prihrani.
V bistvo to pomeni, da za vsak C++ razred, ki ga želiš uporabiti, narediš njegov mC++ ovoj. To pa ni nič hujšega kot npr:
MRazred je tisto, kar vidim in uporabljam v .NET, Razred je pa tisti DLL, ki vsebuje dejansko kodo, ki se izvaja.
Če želiš uporabiti obstoječo C++ knjižnico (s C++ razredi) je edini način, da narediš ovoj (wrapper) v mC++, nato pa v .NET uporabljaš metode preko tega ovoja. Samo po sebi je to sicer res dolgočasno delo, nikakor pa to ne pomeni, da je potrebna kakšna huda predelava. Ravno izdelava ovoja je tisto, kar ti predelavo prihrani.
V bistvo to pomeni, da za vsak C++ razred, ki ga želiš uporabiti, narediš njegov mC++ ovoj. To pa ni nič hujšega kot npr:
class Razred { public: Razred() {} ~Razred() {} void test() { /* Tukaj se nekaj naredi */ } }; ref class MRazred { private: Razred *m_pRazred; public: MRazred() { m_pRazred = new Razred(); } ~MRazred() { delete m_pRazred; } void test() { m_pRazred->test(); } };
MRazred je tisto, kar vidim in uporabljam v .NET, Razred je pa tisti DLL, ki vsebuje dejansko kodo, ki se izvaja.
JerKoJ ::
Poleti sem nekaj delal s tem in ugotovil, da ne zastopim cist nic.
Po principu, ki ga predlaga BlueRunner mi ni uspelo, ker se stvari nikakor niso hotle kompajlat (zal nisem mel vpliva na c++ .lib, da bi ga se enkrat zgradil). Stvar sem resil tako, da sem naredil unmanaged c++ dll. Vso potrebno funkcionalnost .lib-a sem naredil kot funkcije (slab OO pristop), ki sem jih prek Dllimport potem lahko klical iz C#. Najvecji problem so kaksni kazalci (kar je v C++ skoraj vse - callback funkcije, arrayi, za stringe celo nekaj sam pretvori).
Eto neki za c# 1.1 (Visual studio .NET 2003):
Naredis sestej.h:
in seveda sestej.cpp:
Vse skupaj prevedes v sestej.dll
in potem imas v C# sestej.cs:
Po principu, ki ga predlaga BlueRunner mi ni uspelo, ker se stvari nikakor niso hotle kompajlat (zal nisem mel vpliva na c++ .lib, da bi ga se enkrat zgradil). Stvar sem resil tako, da sem naredil unmanaged c++ dll. Vso potrebno funkcionalnost .lib-a sem naredil kot funkcije (slab OO pristop), ki sem jih prek Dllimport potem lahko klical iz C#. Najvecji problem so kaksni kazalci (kar je v C++ skoraj vse - callback funkcije, arrayi, za stringe celo nekaj sam pretvori).
Eto neki za c# 1.1 (Visual studio .NET 2003):
Naredis sestej.h:
extern "C" { __declspec(dllexport) int sestej(int a,int b); }
in seveda sestej.cpp:
#include "lib.h" #pragma comment(lib,"lib.lib") int sestej(int a,int b) { int c=special_lib_function(a,b); return c; } /*dll entry point - ne dela nic /lahko pa bi (nisem ziher ce je res potreben)*/ BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
Vse skupaj prevedes v sestej.dll
in potem imas v C# sestej.cs:
using System; using System.Runtime.InteropServices; public class Sestej { [DllImport(sestej.dll)] public extern static int sestej(int a, int b); .... }
BlueRunner ::
Lib je pri DLL datotekah samo opis vstopnih točk za sam DLL. Zato ne vem, zakaj kakšna stvar pri prevajanju ne bi delovala. Edina omejitev, ki jo poznam, je, da mora biti knjižnica v obliki, kot jo pozna VS. Nisem pa do sedaj še nisem poskusil, ali je v mC++ možno vključiti kar statično objekto knjižnico.
V splošnem pa imam s mC++ ovoji kar dobre izkušnje. Do sedaj so še vedno delovali po pričakovanjih, kakšnega hudega dela z njimi pa tudi nisem imel. Res pa je, da mi je C++ že v osnovi domač. To pri takšnih stvareh zelo pomaga...
V splošnem pa imam s mC++ ovoji kar dobre izkušnje. Do sedaj so še vedno delovali po pričakovanjih, kakšnega hudega dela z njimi pa tudi nisem imel. Res pa je, da mi je C++ že v osnovi domač. To pri takšnih stvareh zelo pomaga...
noraguta ::
na žalost to ne gre v omenjenem pimeru ,ker praktično kar dobiš iz dll ali lib je le pointer na strukturo ter pointer na funkcijo. kjer seveda ni tipske verodostojnosti katero zaheva CLI. tako da moraš zgraditi kontekstno soodvisnost med structom ter proceduro povsem na novo prek marshalinga.
Pust' ot pobyedy k pobyedye vyedyot!
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Dll napisan v C++ importan v C# aplikacijoOddelek: Programiranje | 3919 (3706) | cikopero |
» | uporaba C++ unmanaged kode v C#.NET projektuOddelek: Programiranje | 1927 (1650) | krho |
» | [C#] unmanaged->managed codeOddelek: Programiranje | 2159 (2034) | Zzzzzzz |
» | Uporaba .dllOddelek: Programiranje | 1514 (1474) | Vesoljc |
» | c++ header fileOddelek: Programiranje | 863 (822) | Vesoljc |