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?