Avatar billede MasterException Nybegynder
18. juni 2009 - 22:14 Der er 6 kommentarer og
1 løsning

Marshal problem fra nativ kode

jeg har et problem med at jeg får en MarshalDirectiveException når jeg prøver at få fat i en adresse til et menoryområde nede fra mit nativ kode op til mit C#, så jeg kan opperer med det som var der et uint32 array. regne med at det er mig der ikke kan finde ud af at lave den rigtige Marshal mellem c og c#

nativ code

volatile unsigned int *bufp=0;

...
bufp bliver sat lig med starten på et fix size array
...

extern unsigned int * get_pci_pcmem_bufp(void){
    return *bufp;
}

C#

static void Main(string[] args)
        {....
        ....
        UInt32[] bufp = GetPICPcmenBufp();  // Marshal problem
        ....
        ....
        }

[DllImport("test.dll", EntryPoint = "get_pci_pcmem_bufp", CallingConvention = CallingConvention.Cdecl)]
        public static extern UInt32[] GetPICPcmenBufp();
Avatar billede martinbk Nybegynder
19. juni 2009 - 01:13 #1
må indrømme jeg aldrig har rodet med at marshalle arrays men normalt ville man benytte den statiske Marshal class

et bud som måske kan hjælpe dig lidt videre kunne være

Uint32[] bufp = Marshal.PtrToStructure(GetPICPcmemBufp(), typeof(Uint32[]));
Avatar billede arne_v Ekspert
19. juni 2009 - 11:45 #2
Det er ihvertfald aabenlyst hvorfor det ikke kan virke.

.NET CLR har ingen mulighed for at se hvor mange elementer der er i arrayet.

Et managed array har en bestemt stoerrelse. Den information skal med over.

Maaske 2 funktioner: en som returnerer en int og en som returnerer en pointer (IntPtr paa .NET siden). Saa kan man faa de data fisket ud som vil.
Avatar billede MasterException Nybegynder
19. juni 2009 - 12:05 #3
ja der er også rigtig nok arne_v men kan det ikke lade sig gøre at arbejde på et unmanaged array uden jeg skal kopi det til den managed dele måden jeg gør det på lige nu er


byte[] bufp = new byte[9 * 1024 * 1024];

IntPtr array = GetPICPcmenBufp();

Marshal.Copy(array, bufp, 0, 5 * 1024 * 1024);


[DllImport("test.dll", EntryPoint = "get_pci_pcmem_bufp", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr GetPICPcmenBufp();


men det giver bare et utrolig stort memory forbrug da jeg har det liggende to gange så både i min unmanaged og managed del
Avatar billede arne_v Ekspert
19. juni 2009 - 13:29 #4
Maaske kan du hente en IntPtr og saa bruge den til at hente og saette fra og til arrayet?
Avatar billede arne_v Ekspert
19. juni 2009 - 13:31 #5
Marshal ReadInt32 og WriteInt32.
Avatar billede MasterException Nybegynder
23. juni 2009 - 12:39 #6
jeg har så stykke noget sammen fra det du sagde arne_v tak for hjælpen smid et svar.
Avatar billede arne_v Ekspert
23. juni 2009 - 17:42 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester