Ciao Marco1995,

dal tuo messaggio non è perfettamente chiaro se ciò che ritorna la funzione è un singolo carattere o una stringa, ma propendo per il secondo caso.
Premetto subito che non è affatto banale ritornare una stringa tramite una funzione esportata da una DLL, dato che c'è sempre il grosso rischio di memory leak. Quando eventuali alternative non sono percorribili (come presumo in questo caso), bisogna quindi fare molta attenzione nell'allocazione all'interno della DLL, usando l'API giusta.

In ogni caso non è necessario utilizzare contesti unsafe per dichiarare la funzione che hai creato, C# ci viene in soccorso nel marshalling facendo già tutto per noi, compresa la deallocazione della stringa una volta chiamata la funzione.

Come dicevo, l'allocazione (nella DLL C) NON DEVE essere fatta tramite new, malloc() o quant'altro, ma esclusivamente usando CoTaskMemAlloc().
Quindi la funzione esportata apparirà simile a questa:

#include [list=1] /* CoTaskMemAlloc */

extern "C"
{
__declspec(dllexport) char* dllFunction(char *param)
{
static const char msg[] = "I love ";

char* retString = (char*)CoTaskMemAlloc(sizeof(msg) + strlen(param));
strcpy(retString, msg);
strcat(retString, param);

return retString;
}
}

Lato C# a questo punto non resta molto da fare se non dichiarare la firma della funzione, con:

[DllImport("test_lib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern string dllFunction(string param);

Da notare gli attributi CharSet (stiamo parlando di stringhe C, quindi per default non Unicode) e la CallingConvention, Cdecl, normalmente usata da C/C++.
Come puoi vedere non è necessario usare la keyword unsafe perchè il marshalling viene fatto in automatico, usando comodissime string.

Non resta altro che chiamare la nostra funzione con un metodo della classe:

public string test(string param)
{
return dllFunction(param);
}

E chiamando il tutto nel Main:

Class1 class1 = new Class1();
string retVal = class1.test("CSharp");
Console.WriteLine("Messaggio: {0}", retVal);

Otterremo su console qualcosa del tipo:

Messaggio: I love CSharp

Hope this help!!!


Ciao