CallingConventionの謎

DllImportではCallingConventionが指定できます。しかし、__cdeclを__stdcallとして呼び出しても落ちたりしません。ですが、

using System;
using System.Runtime.InteropServices;
using System.Security;

[SuppressUnmanagedCodeSecurity]
class Program {
  [DllImport("MyDLL", CallingConvention = CallingConvention.StdCall)]
  public static extern int CdeclCallFunc(int a, int b, int c);
  
  [STAThread]
  static void Main(string[] args) {
    Console.WriteLine(CdeclCallFunc(1, 2, 3));
  }
}

このようにSuppressUnmanagedCodeSecurityを付けるとざっくり落ちます。更に、

CallingConvention = CallingConvention.StdCall

↑を削除しても落ちます。つまり、SuppressUnmanagedCodeSecurity属性を付けた場合は、正しくCallingConventionを指定しなければならないということになります。んー、ということは、CallingConventionはSuppressUnmanagedCodeSecurityを指定した場合にのみ意識すれば良いのでしょうか・・・? でも、この辺は仕様ではなく実装依存な気がしますので正しく指定しておくに越したことはないのでしょうね。

・・・と、投稿ネタを使いまわす。(^^;

http://d.hatena.ne.jp/akiramei/20040518#p1
↑SuppressUnmanagedCodeSecurityが何の役に立つかはこちらを参照ください。