odbieranie ciągów poprzez interop

Mam problem z odzyskaniem łańcucha z napisanego przeze mnie kodu.

Najpierw kilka ogólnie nierealnych informacji w tle: Chciałbym otrzymać czytelny dla użytkownika ciąg dla TAPI TSP z interfejsu API TAPI. Wdrożyłem półpraktyczne rozwiązanie TAPI polegające na dopasowywaniu nazw sterowników do przechowywanych ciągów, ale chciałbym zmienić to, aby działało na stałych identyfikatorach linii, ponieważ jeden z naszych klientów ma PBX (Alcatel), który odmawia pracy w inny sposób .

W C definiuję funkcję w moim pliku nagłówkowym jako:

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

Funkcja jest napisana w ten sposób:

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

Jak wspomniano powyżej, w końcu zrobi to coś pożytecznego, ale na razie będę szczęśliwy, jeśli abc zostanie umieszczone w moim wchar_t * / StringBuilder i zobaczę to w C #.

W C # I zdefiniuj funkcję jako:

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

Definiuję DeviceName jako StringBuilder, ponieważ łańcuch jest niewrażliwy i chcę, aby nazwa DeviceName była ustawiona w C (Jest to zalecane przez MS). Ustawiłem także typ powrotu navoid na szczupłą nadzieję, że to także wpływa na coś (patrzto pół pomocny artykuł mono dla częściowego pseudonaukowego wyjaśnienia).

I nazwij to tak:

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

Załączam mój debugger do uruchomionego procesu, ustawiam punkt przerwania i zwracam uwagę w kodzie C, który jakoś StringBuilder jest zboczony i jest dostarczany do niezarządzanego kodu jako wskaźnik zerowy.

Wyjątek AccessViolationException jest następnie generowany w C #.

Co poszło nie tak?

pomaga usunięcie długiego parametru. Jestem w stanie dodać „abc” do mojego parametru DeviceName w C. Chcę jednak tej długiej zmiennej! Co robię źle lub denerwuję, aby wymusić awarię, mając tam ten długi parametr?

questionAnswers(3)

yourAnswerToTheQuestion