Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Problém s mixováním unmanaged a managed kódu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Problém s mixováním unmanaged a managed kódu

Autor: rimer123

10:38:28 26.03.2010

Moc děkuju za rady už se mi to podařilo zprovoznit. Problém byl jako obvykle zakopán úplně jinde :) Varianta se StringBuilderem sice funguje, ale pouze do té doby, než se v poli vyskytne 0, předávání pole jak jste psal je bez problému. Jinak jsem zjistil, že při zadání parametrů, které se automaticky nepřevedou to hází výjimku NotSupportedException.

Citovat příspěvek

 

RE: Problem s mixovanim unmanaged a managed kodu

Autor: RSTEIN

13:58:18 24.03.2010

1) Předávat dynamicky alokovana data z knihovny je určitě lepší než předávat
lokální data funkce. :) Ne vážně - pokud dodržujte pravidlo
alokace/dealokace paměti v jednom modulu (Vaše C++ knihovna bude mít ještě
funkci ReleaseMemory, tak v tom nevidim problem - stejne tak musite u tridy
Marshal volat dvojici Marshal.AllocHGlobal a Marshal.FreeHGlobal).

2) Zkusil jste nadeklarovat v C# jen pole byte[] a argument v C# dekorovat
atributem[MarshalAs( UnmanagedType.LPArray)]. Da se pouzit i unsafe kontext
a ze C# pouzit primo pointery (fixed na byte poli) apod.

Pokud byste to nerozchodil, napisu vam nejaky priklad na ziskani dat z API
funkce.


Zdravím
Rene Stein
http://blog.renestein.net
twitter: http://twitter.com/renestein

Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Problém s mixováním unmanaged a managed kódu

Autor: rimer123

8:36:58 24.03.2010

1) Samozřejmě jsem předával dynamicky alokovaná data, ale to jsem zkoušel spíš jenom jako pokus, protože předávat z knihovny dynamicky alokovaná data většinou není moc dobrý návrh knihovny.

2)Tady nevím jak vytvořit instanci IntPtr nebo spíš jak alokovat pole. Mám požít Marshal.AllocHGlobal? Právě používání této třídy vůbec nerozumím a ani nemůžu najít rozumné materiály, pouze pár příkladů.

Citovat příspěvek

 

RE: Problem s mixovanim unmanaged a managed kodu

Autor: RSTEIN

17:56:53 22.03.2010

Dobry den,
Tech problemu tam bude vice, ale:


1) Jestlize ve variante s navratovou hodnotou predavate odkaz na lokalni
promennou data[], tak tato promenna je zlikvidovana po vystupu z funkce
GetData a v C# s ni tezko muzete pracovat - musel byste v C++ pole alokovat
dynamicky pomoci new.

2) Nevim, jestli potrebujete zrovna StringBuilder, spolehnout se na vychozi
marshalling a rvat do nej v C++ data pres memcpy. Zkuste radeji v C#
predavat do C++ pole bytu (argument muzete v dllimportu deklarovat jako
IntPtr).



Zdravím
Rene Stein
http://blog.renestein.net
twitter: http://twitter.com/renestein

Příspěvek zaslán emailem

Citovat příspěvek

 

Problém s mixováním unmanaged a managed kódu

Autor: rimer123

17:12:44 22.03.2010

Vyvíjím aplikaci pro win mobile 5, procesor arm. Jádro aplikace je dll v C++ a grafické rozhraní je v C#. Mám problém s předáváním dat mezi oběma částmi programu. Knihovna předává binární data(pole) řádově jednotky kilobajtů. Pokud je pole menší než 512 bajtů, tak vše proběhne v pořádku, ale pokud je větší, knihovna spadne na chybě Data Abort při volání memcpy. Pokud ale volám memcpy nad buferem alokovaným v knihovně, vše proběhne v pořádku.
[code]
//část v C++
void GetData(char * buffer)
{
char data[1000];
...
memcpy(buffer, data, sizeof(data));//spadne na Data Abort pokud sizeof(data) > 512
return;
}
//část v C#
...
[DllImport("knihovna.dll")]
private static extern void GetData(StringBuilder buffer);
public static void Main()
{
StringBuilder buffer = new StringBuilder(1024);
GetData(buffer);
}
[/code]
Podobně se program chová i pokud data vracím v návratové hodnotě. Spadne buď na Data Abort v knihovně nebo na OutOfMemoryException v .NETu.
[code]
//C++
char * GetData();
//C#
[DllImport("knihovna.dll")]
private static extern IntPtr GetData();
public static void Main()
{
IntPtr p = GetData(buffer);
...
}
[/code]
Předem děkuji za jakoukoliv radu.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: