recibiendo cuerdas a través de interoperabilidad

Estoy teniendo problemas para recuperar una cadena de algún código c que escribí.

Primero, algo de información general no relacionada: me gustaría recibir la cadena legible por el usuario para un TSP de TAPI desde la API de TAPI. He implementado una solución TAPI semi funcional que se basa en hacer coincidir los nombres de los controladores con las cadenas almacenadas, pero me gustaría cambiar esto para que funcione en las identificaciones de línea permanentes, ya que uno de nuestros clientes tiene un PBX (Alcatel) que se niega a trabajar de otra manera .

En C, defino la función en mi archivo de cabecera como:

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

La función está escrita así:

__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));
}

Como se indicó anteriormente, esto eventualmente hará algo útil, pero por ahora estaré contento si se coloca abc en mi wchar_t * / StringBuilder y puedo ver eso en C #.

En C # defino la función como:

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

Defino DeviceName como StringBuilder porque una cadena es inmutable y quiero que DeviceName se establezca en C (Esto es recomendado por MS). También puse el tipo de retorno avoid en la delgada esperanza de que eso también afecta algo (veresta Artículo semi útil para una explicación pseudocientífica parcial.

Y llámalo así:

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

Adjunto mi depurador al proceso en ejecución, establezco un punto de interrupción y, en el código C, observo que el StringBuilder se pervierte y se proporciona al código no administrado como un puntero nulo.

Posteriormente, se lanza una excepción AccessViolationException en C #.

¿Qué ha ido mal?

Eliminar el parámetro largo ayuda. Puedo agregar "abc" a mi parámetro DeviceName en C. ¡Sin embargo, quiero esa variable larga! ¿Qué estoy haciendo mal o molesto para forzar una caída al tener ese largo parámetro allí?

Respuestas a la pregunta(3)

Su respuesta a la pregunta