我在使用C#中的pinvoke調用_snwprintf時遇到了一個有趣的問題。它適用於整數類型,但不適用於浮點數。在c#中使用pinvoke在64位調用sprintf和好友
這是在64位Windows上,它在32位上工作正常。
我的代碼如下,請記住,這是一個人爲的例子,顯示我看到的行爲。
class Program
{
[DllImport("msvcrt.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern int _snwprintf([MarshalAs(UnmanagedType.LPWStr)] StringBuilder str, IntPtr length, String format, int p);
[DllImport("msvcrt.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern int _snwprintf([MarshalAs(UnmanagedType.LPWStr)] StringBuilder str, IntPtr length, String format, double p);
static void Main(string[] args)
{
Double d = 1.0f;
Int32 i = 1;
Object o = (object)d;
StringBuilder str = new StringBuilder(32);
_snwprintf(str, (IntPtr)str.Capacity, "%10.1lf", (Double)o);
Console.WriteLine(str.ToString());
o = (object)i;
_snwprintf(str, (IntPtr)str.Capacity, "%10d", (Int32)o);
Console.WriteLine(str.ToString());
Console.ReadKey();
}
}
該程序的輸出是
0.0
1
它應該打印1.0在第一行上,而不是0.0,到目前爲止我難倒。
什麼樣的惡魔會開車送你到PInvoke的C運行時的printf家庭? C調用約定,可變參數,非操作系統部署的DLL,它像breweing完美的風暴! – 2010-03-19 17:10:01
是不是string.Format足夠你? – zneak 2010-03-19 17:12:50
@Remus - 我意識到這並不是一件好事,而是在尋求麻煩,然而有時候我們都必須忍受現有的代碼。此外,儘管可能會有多麼可怕,但在我看來,它仍然應該起作用。 – WildCrustacean 2010-03-19 17:13:13