5

なぜFoo()成功するのにBar()スローするのBadImageFormatExceptionですか?

using System.Runtime.InteropServices;
using System.Text;

static class Program
{
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern int sprintf([Out] StringBuilder buf, string format, __arglist);

    static void Main(string[] args)
    {
        Foo<int>(2); //Runs fine
        Bar<int>(2); //Error: "The signature is incorrect"
    }

 static void Foo<T>(int a) { sprintf(new StringBuilder(8), "%d", __arglist(a)); }
 static void Bar<T>(T   a) { sprintf(new StringBuilder(8), "%d", __arglist(a)); }
}
4

3 に答える 3

0

このようにしてみてください:

using System;
using System.Runtime.InteropServices;
using System.Text;

static class Program
{
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern int sprintf([Out] StringBuilder buf, string format, params object[] args);

    static void Main(string[] args)
    {
        Foo(2);
        Bar<int>(2);
    }

    static void Foo(int a) { sprintf(new StringBuilder(8), "%d", a); }
    static void Bar<T>(T a){ sprintf(new StringBuilder(8), "%d", a); }
}
于 2011-05-01T07:38:53.247 に答える
0

文書化されていない (_ arglist, _makeref,_ reftype, _refvalue) キーワードが機能しない理由を尋ねています。

Microsoft に聞いてみてください :D

これに関する私の見解を本当に知りたい場合は、ジェネリックがコンパイル時に T の型を認識していないにもかかわらず、クラスにコンパイルされている可能性があります。コンパイル時に __arglist に何がかかるのかは謎です。ジェネリックを宣言する行では、__arglist にパラメーターの種類を指定しないでください。

しかし、これはすべて、C# から sprintf を使用するのと同じくらいあいまいです...少なくとも _snwprintf_s または同様の場合:D

于 2011-05-01T07:49:48.640 に答える
0

次のコードに示すように、メソッドがネイティブ コードにコンパイルされると、メソッドを実行する前に例外がスローされます。

var t = typeof(Program);
var m = t.GetMethod("Bar", BindingFlags.NonPublic | BindingFlags.Static);
m = m.MakeGenericMethod(typeof(int));
System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(m.MethodHandle); //error

また、 SizeOfに渡された型が間違っていると不平を言っています。メソッドに渡される実際の型のハンドルではなく、内部ハンドルをジェネリック型パラメーターに渡す原因となる CLR のバグである可能性があります。

于 2014-07-21T12:27:20.360 に答える