[C#] C++ header/lib gebruiken in C# project

Pagina: 1
Acties:

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
Ik ben relatief nieuw in C# en ben ook geen doorgewinterde C++ programmeur. Eigenlijk ben ik de boel een beetje aan het verkennen en ik ben een testprojectje aan het doen waarvoor ik een SDK heb ontvangen die geschreven is in C++.
Ik heb een aantal headerfiles en een lib file.

Mijn project is geschreven in C# en nou wil ik dus API calls gaan maken naar die SDK (die vervolgens de USB h/w aan gaat spreken). Mijn grote vraag is dus hoe ik dit precies moet aanpakken.

Ik heb gegoogled en kom daar wel van alles tegen over P/Invoke, maar dat gaat (voor zover ik weet) over DLLs. Het schrijven van een managed C++ wrapper vind ik nu niet echt een optie...

Ik weet dus niet hoe ik een lib file kan linken aan een C# project. Of moet ik er toch eerst een win32 dll van maken? En zo ja, wat zou ik daar dan voor moeten doen ? (heb nog nooit een DLL gecompileerd..)
En, als ik het dan gelinkt heb, hoe kan ik het dan aanspreken..? Ik kan eigenlijk geen goede artikelen hierover vinden en mijn C# boek zegt er ook niets over.
Omdat ik niet zo goed weet waar ik moet beginnen vind ik ook weinig nuttige informatie. Misschien kan iemand me hier wegwijs maken in de wereld van libs, headers, dlls en .NET

Verwijderd

Het schijnt te gaan volgens dit MSDN artikel, maar voor instructies over hoe wordt je doorverwezen naar vage bronnen, waarschijnlijk omdat het zwaar wordt afgeraden op deze manier legacy code aan te roepen. Zie ook de bijnaam:
C++ interop (sometimes referred to as It Just Works (IJW)) is a C++-specific feature, which enables flat APIs and COM APIs to be used directly, as they have always been used.
Waarschijnlijk is het verstandiger om toch een wrapper te schrijven, maar ik ben geen expert. Misschien dat een C++ goeroe op dit forum nog wat te zeggen heeft hierover?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
IJW is zoals terecht gezegd C++-specifiek. In C# red je dat niet.
De vraag is wat je precies voor een .lib hebt. Is dat een echte complete .lib, of alleen de import .lib van een DLL? Een SDK heeft heel erg vaak alleen zo'n import .lib, en dan kun je dus wel P/Invoke gebruiken op de onderliggende DLL.. Is het een echte C++ lib? Dan werkt het zeker niet; C++ heeft name mangling, een ander native string type, andere arrays etcetera.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
Nou ja, zoals ik al zei heb ik er niet zo heel veel kaas van gegeten...
Ik heb het bedrijf gebeld om navraag te doen over de hele API. Het is een C/C++ API volgens de docs.. Maar ik zou er dus een win32 dll van moeten bouwen volgens mij... maar dr zitten geen projects files bij en ook weinig beschrijving van welke bestanden daarvoor nodig zouden zijn (plus dat ik dat nog nooit gedaan heb).
Ik weet dus niet wat voor lib dat is... er zit verder geen dll bij, alleen die lib... bedankt voor zover!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Hoe ziet die header file eruit die bij je .lib-file is meegeleverd? Worden er veel nieuwe datatypes gedefinieerd en gebruikt, of zijn het voornamelijk functies die de standaard C datatypes gebruiken? Worden er array's gebruikt als argumenten, of strings? Zo ja, const char *, std::string of een ander type?

Hoe meer nieuwe datatypen, strings en arrays er gebruikt worden, des te moeilijker zal het worden om vanuit je C#-code rechtstreeks functies van je (nog te bouwen) DLL aan te roepen. In dat geval is het ws. beter om een wrapper te schrijven.
Als de library alleen maar 'simpele' datatypes gebruikt, dan kun je ws. wel zonder wrapper af.

N.B. Ik ben geen C#-kenner, maar ik neem aan dat bovengenoemde zaken de belangrijkste zaken zijn om interoperabiliteit voor elkaar te krijgen.

Verwijderd

Van wat ik tot nu toe van c# interop heb gezien kan ik de bovenstaande post beamen. Maar ik heb ook (_dacht ik_) eens ergens gelezen dat het mogelijk is om in Visual Studio in-line unsafe c++ te gebruiken. Het is niet bepaald aan te raden, maar misschien zou je zo een DLL kunnen laden om het uit te proberen.

Maar als het een commercieel pakket is, dan hebben ze toch ook vast een COM interface gemaakt, of zullen ze zelf wel geinteresseerd zijn om een wrapper te implementeren (eventueel tegen een _lage_ vergoeding). Ik zou het eens voorstellen, per slot van rekening verhoogt het de marktwaarde en toekomstperspektief van hun product aanzienlijk.

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
Nou, er is dus idd een COM interface... Ik heb gebeld en daar wezen ze mij zojuist op... Dus nu ga ik me daar maar eens in verdiepen... Ik voel me wel een enorme novice nu, maar goed, dat is ook zo :)
Bedankt voor zover!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Haha, een COM interface!? Man, had dat eerder gezegd, dan ben je zo klaar :) Wat ik van C# heb gezien gaat het echt heel elegant om met COM-interfaces. Lijkt me idd dat dit 'the way to go' is.

  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 27-11 14:05

giMoz

iets met meester...

ok, een kick na meer dan 2 jaar, maar dit is wel wat ik wil...
een lib met een paar .h files van C++ gebruiken in C#, maar dit x heb ik geen com interop...

met swig, kan je wrappers laten genereren maar dan moet je een .i bestand hebben,
en ik kan ook niet vinden hoe je die kan maken van een set met h files..

Iemand ergens een goede howto???
of id'en.
Want alles wat ik met google vind (lib to C#, C++ h to i en varianten daarop) gaat toch wel uit van een redelijke kennis van C++.
Daarbij weet ik ook niet precies welke functies er allemaal in die lib zitten....

(voor degene die het interessant vinden: tgaat om deze sdk...

Of niet natuurlijk...


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 27-11 14:05

giMoz

iets met meester...

niet zo subtiele kick....
iemand?

Of niet natuurlijk...


  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 10-10 12:36
giMoz schreef op maandag 05 februari 2007 @ 11:35:
niet zo subtiele kick....
iemand?
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetConsoleTextAttribute(
IntPtr hConsoleOutput, ConsoleAttributes wAttributes);

super simpel voorbeeldje van een SetConsoleTextAttributes functie in de kernel32.dll.

Dit heet dus Interop is een echte hel en maakt gebruik van marshaling

kijk voor meer info hier http://www.codeproject.com/netcf/compframe1.asp

  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 27-11 14:05

giMoz

iets met meester...

ja, maar dat is voor een .dll, werkt dat ook voor een .lib?

Of niet natuurlijk...

Pagina: 1