4
[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();

これが、アンマネージC++ライブラリからインポートした関数だとしましょう。この場合、外部関数はを返すものとして宣言されていintます。のサイズはint、マネージC#コードでは変更されませんが、アンマネージC++コードのアーキテクチャによっては変更されます。それがを返すと仮定するのは安全intですか?IntPtr代わりに、戻り値として使用する必要がありますか?または、他の何か?

4

2 に答える 2

5

intC#では、これからも常にそうなりますSystem.Int32。重要なのは、すべてのC ++コンパイラは(理論的には)型のサイズ(特定の制限内)で自由に実行できるため、不一致を回避したい場合は、C++を変更する必要があります。コードの側で、固定サイズの整数(eg)を返すようにしint32_tます。ポインタのサイズを持つように定義されていIntPtrないため、役に立ちません(実際、x86_64ではWindowsは32ビットですが、は64ビットです)。intintint *

一方、 x86 Windows上のコンパイラが、バイナリ互換性の理由から、32ビットの2の補数int整数とは異なるものとして定義される可能性はほとんどありません。

于 2013-02-10T13:39:54.160 に答える
0

たとえば、g++の場合は「-m32」または「-m64」を使用してコンパイラオプションを設定する必要があります。より具体的には、「マシン依存オプション」に基づいて最適なものを選択してください

于 2013-02-10T14:16:41.867 に答える