[C#] Errore in Pinvoke nell'importazione di una dll

domenica 25 maggio 2008 - 11.16

LeoB Profilo | Newbie

Ciao a tutti, sono nuovo e grazie al vostro sito mi sono avvicinato al mondo .NET. Ora sto provando ad importare in un progetto C#, una funzione contenuta in una DLL scritta in C++.
La firma della funzione è:

int regBox( const char *BID, const char* ModelName );

Ho provato ad importare la funzione con questo codice:

[DllImport("GGS.dll")] public static extern int regBox( [MarshalAs(UnmanagedType.LPStr)] string boxid, [MarshalAs(UnmanagedType.LPStr)] string model);

Ottengo però questo errore:

Una chiamata alla funzione PInvoke 'Test GV API!Test_GV_API.GVImport::regBox' ha sbilanciato lo stack. Questo problema può verificarsi quando la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata e i parametri della firma PInvoke corrispondano alla firma di destinazione non gestita.

Avete qualche idea su come si possa risolvere la questione?

grazie mille per l'aiuto!

freeteo Profilo | Guru

ciao,
la firma non è perfettamente uguale, i nomi delle variabili sono diversi anche se non credo sia questo il problema, piuttosto credo sia il tipo che devi rimappare a stringa in .net, io proverei ad usare StringBuilder:

[DllImport("GGS.dll")] public static extern int regBox( StringBuilder boxid, StringBuilder model);

oppure direttamente "string", senza specificare l'attributo "LPStr...etc..."
Al massimo potrebbe essere da aggiungere:
[DllImport("GGS.dll", CharSet=CharSet.Ansi)]
anche se io non l'ho mai specificato, e di default non ho mai avuto problemi...

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

LeoB Profilo | Newbie

Ciao, ti ringrazio per la tua risposta!
Dopo aver perso tutta la giornata di ieri a cercare di capire il motivo del problema, questa mattina ho telefonato al produttore della dll. Ho scoperto che hanno sbagliato a scrivere la documentazione e la fimra corretta della funzione è

int regBox(const char* boxid)

A questo punto usando un semplice string come mi hai suggerito funziona perfettamente. Mannaggia a loro!!

Grazie ancora per l'aiuto!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5