Вам нужно использовать ключевое слово __arglist (недокументированное), у Bart # был хороший блог об этом.
Пример
class Program
{
[DllImport("user32.dll")]
static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist);
static void Main(String[] args)
{
var sb = new StringBuilder();
wsprintf(sb, "%s %s %s", __arglist("1", "2", "3"));
Console.Write(sb.ToString());
}
}
Не является стандартным способом определения vararg-методов, большинство решений оборачивают его несколькими способами, например
[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods1(String fmt,
String arg1);
[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods2(String fmt,
String arg1, String arg2);