我在使用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