32bitと64bitのDllImport動的切り替えで、どうやって呼び出し先を選択するかと言えば、抽象メソッドと継承を使うかifで呼び分けるかの選択肢がありますが、今回、どちらが早いか実験してみたのでメモしておきます。

1.仮想メソッド方式
メソッドを定義した抽象クラスと、それを呼び出し先DLLごとに分けたサブクラスを作成し、プログラム初期化時に適切な方をnewしてそれを呼び出します。


<br />
class Program {<br />
    public static void Main() {<br />
        BaseClass dll;</p>
<p>        if (IntPtr.Size == 4)<br />
            dll = new SubClass32();<br />
        else<br />
            dll = new SubClass64();</p>
<p>        dll.method(); // 呼び出し<br />
    }<br />
}</p>
<p>abstract class BaseClass {<br />
    public abstract void Method1();<br />
}</p>
<p>class SubClass32 : BaseClass {<br />
    public override void Method1() =&gt; method(); // ラムダ実装。C#6.0から利用可能</p>
<p>    [DllImport(&quot;パス32.dll&quot;)]<br />
    static extern void method();<br />
}</p>
<p>class SubClass64 : BaseClass {<br />
    public override void Method1() =&gt; method(); // ラムダ実装。C#6.0から利用可能</p>
<p>    [DllImport(&quot;パス64.dll&quot;)]<br />
    static extern void method();<br />
}<br />

2.if分岐方式
現在の実行環境が32bit、64bitのどちらかを呼び出し時に判定して分岐する方式です。


<br />
class Program {<br />
    public static void Main() {<br />
        // 呼び出し<br />
        if (IntPtr.Size == 4)<br />
            method32();<br />
        else<br />
            method64();<br />
    }</p>
<p>    [DllImport(&quot;パス32.dll&quot;, EntryPoint = &quot;method&quot;)]<br />
    static extern void method32();<br />
    [DllImport(&quot;パス64.dll&quot;, EntryPoint = &quot;method&quot;)]<br />
    static extern void method64();<br />
}<br />

結果は、「if分岐方式」の方が早かったです。
呼び出し処理をそれぞれ100000000回実行した場合の時間を比較したところ、前者は229.6516msだったのに対し、後者は38.5251msだったので結構な差だと思います。

仮想メソッド方式は管理が楽ですが、やはり無駄な処理も増えてしまうようです。
もし32/64bitのDLL呼び出し分けをするならif分岐方式を採用した方がいいと思われます。
ちなみに、if分岐方式でIntPtr.Sizeを静的フィールドにキャッシュしてそれを使った場合、差はほとんどありませんでした。