Portál AbcLinuxu, 9. května 2025 23:40

Dotaz: Použití C++ DLL knohovny v C#

28.8.2011 19:00 BlackyJack | skóre: 1
Použití C++ DLL knohovny v C#
Přečteno: 936×
Odpovědět | Admin
Nazdar,

mám DLL kníhovnu psanou (nejspíš) v C++, potřebuji ji v C# aplikaci pro navázání komunikace, což mi má ta DLL zprostředkovat. Jsem schopný zavolat jednoduché funkce, avšak klíčová funkce má vracet stream (v C++ je to čteno přes fileread a filewrite - či tak nějak), avšak netuším, jak se s tím vyrovnat v c#.

Nemáte někdo zkušenost s podobným problémem? Popř. nemůžete mi dát kontakt na někoho, kdo se s tím občas setkává? Nenechal bych dotyčného škodným.

Díky
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.8.2011 19:55 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nemáte na mysli funkce fread a fwrite ze stdio.h? V C# je lze zadeklarovat takto:
[DllImport("msvcrt.dll", SetLastError=true)]
static extern IntPtr fread(byte[] buffer, IntPtr size, IntPtr count, IntPtr stream);

[DllImport("msvcrt.dll", SetLastError=true)]
static extern IntPtr fwrite(byte[] buffer, IntPtr size, IntPtr count, IntPtr stream);
28.8.2011 20:59 BlackyJack | skóre: 1
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
A pokud by mi nějaké funkce volaná v DLL měla vracet stream, jak se s tím vypořádat?
28.8.2011 22:03 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
To záleží na tom, co je ten stream vlastně zač. Pokud je to ukazatel nebo má velikost ukazatele, lze návratový typ deklarovat jako IntPtr.
28.8.2011 21:14 BlackyJack | skóre: 1
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
Abych to upřesnil, tak vím, že v DLL je funkce OpenXmlBridge, která vrací handle, se kterým se má pracovat přes funkce ReadFile/WriteFile, resp. ReadFileEx/WriteFileEx (jde o asynchronní komunikaci).

Z C# jsem si schopen zavolat funkci OpenXmlBridge, avšak samotným zavoláním se program logicky zastaví...
28.8.2011 22:07 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
Z C# jsem si schopen zavolat funkci OpenXmlBridge, avšak samotným zavoláním se program logicky zastaví...
Tomu nerozumím, když s tím pracujete asynchronně.

Mj. deklarace pro funkce ReadFileEx a WriteFileEx lze najít na serveru pinvoke.net (jsou v knihovně kernel32.dll).
28.8.2011 22:26 BlackyJack | skóre: 1
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
Chápu to tak, že program mi vrátí handle?, který můžu použivat pro zápis/čtení zpráva - jaká si pipe, jenže nevím, jak si to, co mi nějakým mechanismem nabízí obsloužit.

Zkouším se teď vydávám směrem, kdy jsem si nechal vrátit IntPtr a ten si zkouším obsloužit, avšak netuším, zda se vůbec vydávám správným směrem.

Mj, ReadFileEx/WriteFileEx pracují s IntPtr, že?
29.8.2011 01:45 BlackyJack | skóre: 1
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
Tak něco mi to vrací přes funkci:
[DllImport("Moje.dll", SetLastError = true)]
private static extern SafeFileHandle OpenXMLBridge();

//Pak se s tím dá pracovat přes

SafeFileHandle handler = OpenXMLBridge();
FileStream fs = new FileStream(handler, FileAccess.ReadWrite, 4096, true);


Průšvih je, že mi to padá při druhém čtení či zápisu, při fs.Close() mi to padá. Ale... to snad již nějak dořeším.
29.8.2011 08:29 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: Použití C++ DLL knohovny v C#
Není OpenXMLBridge funkce z té DLL knihovny v C a nevrací klasický windowsovský handle? Pokud ano, tak byste tam měl mít IntPtr:
[DllImport("Moje.dll", SetLastError = true)]
private static extern IntPtr OpenXMLBridge();
a pracovalo by se s tím takto:
var handle = new SafeFileHandle(OpenXMLBridge(), true);
var fs = new FileStream(handle, FileAccess.ReadWrite, 4096, true);

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.