30Kb - это небольшой буфер. Если ваша функция работает быстро, вы можете положиться на поведение маршалинга по умолчанию и сделать это:
[DllImport ("your.dll")]
extern int GetImageKN (short[] ndat) ;
var buffer = new short[160 * 120] ;
var result = GetImageKN (buffer) ;
Даже если он может блокироваться в течение длительного времени, вы можете обойтись без этого, если не вызываете эту функцию сразу для нескольких потоков.