C#でprintf

.NET Remotingを使ったクラスの合成を実験していたのですが、Remotingを使うと絶望的にパフォーマンスが悪いことに気づいて意気消沈気味なので小ネタへ逃げます(^^;
で、本題。.NETではprintfの代わりにConsole.WriteLineあたりを使いますが、本当にprintfを使いたいときはどうすれば良いのでしょうか。printfは可変引数を取るのでP/Invokeしようとするときに、ちょっと悩むのではないでしょうか?

using System;
using System.Runtime.InteropServices;

class App
{
  [DllImport("msvcrt", CallingConvention = CallingConvention.Cdecl)]
  public static extern int printf(string format, __arglist);
  static void Main()
  {
    int a = 123;
    float b = 1.23f;
    double c = 123456.789;
    string d = "テスト";
    printf("%d, %f, %e, %s\n",  __arglist(a, (double)b, c, d));
  }
}

こんな感じで__arglistを使います。C#にしては珍しくC++っぽいダーティーなキーワードですよね。あと、なんかfloatを上手く渡せないのでdoubleにキャストしています。