Così ho una funzione, scritto in C++, che assomiglia a questo ...Perché C# e VB.NET implicano in modo implicito il char * in modo diverso?
extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
// stuff
}
... e sto usando nel mio progetto attuale (scritto in C#). Ci sono altri progetti che utilizzano questa funzione scritta in VB, guardando in questo modo:
Public Declare Function SomeFunction Lib "MyDLL.dll" _
Alias "[email protected]" (ByVal theData As String) As Integer
Così ho provato a scrivere un equivalente in C#, ma ha trovato che utilizzando il tipo di stringa in realtà non funziona per me - la stringa sarebbe torna con gli stessi dati con cui l'ho passato. Ho provato a utilizzare "ref string"
invece di passare la stringa per riferimento e ho ricevuto una violazione di accesso alla memoria.
Dopo aver fatto qualche scavo, ho scoperto che questo era la corretta applicazione in C#:
[DllImport("MyDLL.dll", EntryPoint = "[email protected]")]
public static extern int SomeFunction(StringBuilder theData);
Ora so che VB.NET e C# sono molto diverse, ma suppongo che ho sempre dato per scontato che le stringhe sono stringhe . Se una lingua può eseguire il marshalling char*
a String
implicitamente, perché l'altro non può richiedere una classe diversa del tutto?
(a cura del titolo per chiarezza)
Potrebbe essere interessante dare un'occhiata a entrambe le versioni con JustDecompile o .NET Reflector. –