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?