Empfangen von Zeichenfolgen durch Interop

Ich habe Probleme, eine Zeichenfolge aus einem von mir geschriebenen C-Code zurückzugewinnen.

Zunächst einige allgemein nicht realisierte Hintergrundinformationen: Ich möchte die vom Benutzer lesbare Zeichenfolge für einen TAPI-TSP von der TAPI-API erhalten. Ich habe eine semi-funktionsfähige TAPI-Lösung implementiert, die sich auf die Zuordnung von Treibernamen zu gespeicherten Zeichenfolgen stützt, möchte diese jedoch ändern, um stattdessen mit permanenten Leitungs-IDs zu arbeiten, da einer unserer Kunden eine (Alcatel) -PBX hat, die sich weigert, auf andere Weise zu funktionieren .

In C definiere ich die Funktion in meiner Header-Datei als:

__declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName);

Die Funktion lautet wie folgt:

__declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName)
{
    //tapi code here...

    //copy the string to DeviceName
    wcscpy(DeviceName, (wchar_t*)((char *)devCaps + devCaps->dwLineNameOffset));
}

Wie oben erwähnt, wird dies irgendwann etwas Nützliches bewirken, aber im Moment bin ich froh, wenn abc in meinem wchar_t * / StringBuilder abgelegt ist und ich das in C # sehen kann.

In C # definiere ich die Funktion als:

    [DllImport("SBW.Tapi.TapiInterop.dll", CharSet = CharSet.Auto)]
    static extern void GetDeviceName(long DeviceId, StringBuilder DeviceName);

Ich definiere DeviceName als StringBuilder, weil ein String nicht veränderbar ist und ich möchte, dass der DeviceName in C (Dies wird von MS empfohlen). Ich habe auch den Rückgabetyp auf gesetztvoid auf die schlanke Hoffnung, dass das auch etwas betrifft (vgldiese hilfreicher Mono-Artikel für eine teilweise pseudowissenschaftliche Erklärung).

Und nenne es so:

StringBuilder name = new StringBuilder();
name.EnsureCapacity(100);
long n = 0;
GetDeviceName(n, name);

Ich hänge meinen Debugger an den laufenden Prozess an, setze einen Haltepunkt und stelle im C-Code fest, dass der StringBuilder irgendwie pervers ist und als Nullzeiger für den nicht verwalteten Code bereitgestellt wird.

Eine AccessViolationException wird anschließend in C # ausgelöst.

Was ist schief gelaufen?

Entfernen des langen Parameters hilft. Ich kann "abc" zu meinem DeviceName-Parameter in C hinzufügen. Ich möchte diese lange Variable jedoch! Was mache ich falsch oder störe ich, um einen Absturz zu erzwingen, indem ich diesen langen Parameter dort habe?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage