» »

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
dadada

BlueRunner ::

Tudi ceneje :D

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?

duks ::

Prav nic znanja c++ in brez casa za ucenje
mogoce kak tutorila v zivo ;)
dadada

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.

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:
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. :D
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...

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 ...

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

Dll napisan v C++ importan v C# aplikacijo

Oddelek: Programiranje
112197 (1984) cikopero
»

uporaba C++ unmanaged kode v C#.NET projektu

Oddelek: Programiranje
111468 (1191) krho
»

[C#] unmanaged->managed code

Oddelek: Programiranje
111713 (1588) Zvonko
»

Uporaba .dll

Oddelek: Programiranje
6809 (769) Vesoljc
»

c++ header file

Oddelek: Programiranje
5567 (526) Vesoljc

Več podobnih tem