Non esiste un'equivalente della funzione che cerchi, ma il problema più grosso sta nel fatto che le funzioni API da richiamare richiedono una serie di parametri di cui devi fare il "marshalling" poichè stai lavorando con .NET.
.NET è una piattaforma gestita che utilizza un Garbage Collector: passare dall'ambiente "gestito" all'ambiente nativo, quindi "non gestito", richiede a volte l'uso di classi e metodi per convertire i valori della propria applicazione in quelli attesi dalle funzioni API che si desidera richiamare.
Per ciò che devi fare, l'operazione è anche molto complessa, e mi risulta ancora oscuro il motivo per cui si crea un'applicazione .NET per richiamare poi funzioni API di Windows: quali vantaggi dovrebbe portare?
Per dare un'idea di quello che comporta la scrittura di codice che "interopera" con le API, riporto il tuo esempio (opportunamente modificato) con le dovute istruzioni aggiuntive:
codice:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Printers, Windows,
System.Text, System.Runtime.InteropServices;
type
[StructLayout(LayoutKind.Sequential)]
TPrnBuffRec = record
BuffLength: Word;
Buffer: array [0..255] of Byte;
end;
procedure PrintLine;
var
Buff: TPrnBuffRec;
TestInt : Integer;
TestIntPtr: IntPtr;
SourcePtr: IntPtr;
e: ASCIIEncoding;
s: string;
begin
s := #27 + 'W1'+ 'A test string ' + #27 + #10 + ' Ciao Ciao';
TestInt := PASSTHROUGH;
Buff.BuffLength := s.Length;
e := ASCIIEncoding.Create;
Buff.Buffer := e.GetBytes(s);
SourcePtr := Marshal.AllocHGlobal(Marshal.SizeOf(Buff));
try
Marshal.StructureToPtr(Buff, SourcePtr, False);
TestIntPtr := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TestInt)));
try
Marshal.WriteInt32(TestIntPtr, TestInt);
if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TestInt), TestIntPtr, IntPtr.Zero) > 0 then
begin
Printer.BeginDoc;
Escape(Printer.Canvas.Handle, PASSTHROUGH, SizeOf(TPrnBuffRec), SourcePtr, IntPtr.Zero);
Printer.EndDoc;
end;
finally
Marshal.FreeHGlobal(TestIntPtr);
end;
finally
Marshal.FreeHGlobal(SourcePtr);
end;
end;
begin
PrintLine;
end.
Questo è ciò che io chiamo "un bagno di sangue".
So cosa mi stai per dire, che devi seguire le specifiche che ti sono state date.
Beh, direi che puoi buttarle via o rispedirle al mittente in quanto solo un pazzo proseguirebbe su questa strada.
Una fatica del genere per stampare una semplice stringa su una stampante mi sembra davvero eccessiva, oltre al fatto che passi continuamente da .NET a Win32 e viceversa...sarei proprio curioso di leggerle queste "specifiche" per vedere di cosa si tratta...credo siano degne di un romanzo di Asimov! 
Ciao!