recebendo strings através de interoperabilidade

Estou tendo problemas para recuperar uma string de algum código c que escrevi.

Primeiro algumas informações de segundo plano geralmente não realizadas: Gostaria de receber a cadeia de caracteres legível pelo usuário para um TAPI TSP da API TAPI. Implementei uma solução TAPI semi-viável com base na correspondência de nomes de driver para strings armazenadas, mas gostaria de mudar isso para trabalhar com ids de linha permanentes, já que um de nossos clientes tem um PBX (Alcatel) que se recusa a funcionar de outra maneira .

Em C, eu defino a função no meu arquivo de cabeçalho como:

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

A função é escrita assim:

__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 dito acima, isso acabará por fazer algo útil, mas por enquanto eu ficarei feliz se o abc for colocado no meu wchar_t * / StringBuilder e eu puder ver isso em C #.

Em C #, defino a função como:

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

Eu defino DeviceName como um StringBuilder porque uma string é imutável e eu quero que o DeviceName seja definido em C (Isto é recomendado pelo MS). Eu também defino o tipo de retorno paravoid na magra esperança de que isso também afete alguma coisaisto artigo mono semi-útil para uma explicação pseudo-científica parcial).

E chame assim:

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

Anexo meu depurador ao processo em execução, defino um ponto de interrupção e percebo no código C que, de alguma forma, o StringBuilder é pervertido e é fornecido ao código não gerenciado como um ponteiro nulo.

Um AccessViolationException é subseqüentemente lançado em C #.

O que deu errado?

remover o parâmetro longo ajuda. Eu sou capaz de adicionar "abc" ao meu parâmetro DeviceName em C. Eu quero essa variável longa no entanto! O que estou fazendo de errado ou perturbador para forçar uma queda por ter esse parâmetro longo lá?

questionAnswers(3)

yourAnswerToTheQuestion