Budujemy aplikację na C#, .net 4.0, na Win7 x64, targetowanie x32.Wywołanie, wskaźniki i kopia tablicy
Używamy biblioteki innej firmy w naszej aplikacji. Rozumiemy, że ta biblioteka jest napisana przy użyciu C++. Jednakże, aby umożliwić programistom C# wykorzystanie tej biblioteki, owinęli ją za pomocą P/Invoke, dlatego w ten sposób nazywamy funkcje API.
Jednym z API jest następujący:
ReadFromDevice(int deviceAddress, int numBytes, Byte[] data);
Funkcja ta odczytuje numBytes danych z urządzenia zewnętrznego i umieszcza go w danych []. Jak widać, spodziewa się, że tablica C# Byte będzie trzecim argumentem. Teraz naszym problemem jest to, że chcielibyśmy odczytać dane do dowolnej lokalizacji w predefiniowanej tablicy. Na przykład:
Byte[] myData = new Byte[1024*1024*16];
ReadFromDevice(0x100, 20000, &myData[350]) // Obviously not possible in C#
Gdybyśmy używali C/C++, byłoby to banalnie proste. Biorąc pod uwagę, że bazowe API jest napisane w C++, uważam, że powinniśmy móc to zrobić również w języku C#, jednak nie mogę wymyślić, jak to zrobić w języku C#. Może w jakiś sposób możemy wywołać bibliotekę bazową nie za pośrednictwem dostarczonego interfejsu P/Invoke i napisać niestandardowy interfejs?
Wszelkie pomysły będą mile widziane.
Pozdrawiam,
Nie ma konwersja z '*' bajt do bajta '[]', ten kod nie będzie nawet skompilować. Gdyby miał kontrolę nad źródłem C#, to byłaby jedna rzecz, ale nie brzmi tak, jak z oryginalnego pytania. –
To powiedziawszy, po ponownym przeczytaniu pytania * tak * brzmi jak OP ma również dostęp do biblioteki C++, więc powinieneś po prostu zasugerować dodanie własnego DllImport i zmienić podpis, aby zaakceptował 'bajt *' zamiast 'byte []', to by działało. Usuwanie downvote. –
"" Budujemy aplikację na C#, .net 4.0, na Win7 x64, targetowanie x32. Używamy biblioteki innej firmy w naszej aplikacji. Rozumiemy, że ta biblioteka jest napisana przy użyciu C++. programiści używają tej biblioteki, owinęli ją za pomocą P/Invoke, więc w ten sposób nazywamy funkcje API. " Więc mają kontrolę nad C# i piszą wrapper dla biblioteki C++! – N4rk0