通例:
コンパイラは通常、ターゲット メソッドのシグネチャを調べることによって、呼び出し元のプログラムのパラメーターを適切な型に変換します。このシグネチャを使用できるのは、メソッドが呼び出し元のプログラムと同じソース モジュールにある場合や、ILSOURCE 指令で識別されるモジュールまたは ILREF 指令で識別されるアセンブリで識別されるモジュールにメソッドがある場合です。
呼び出し先のプログラムがコンパイル時に認識されていないか、実行時まで使用できない場合、呼び出し先のプログラムは CALL 文のデータ項目のみに基づいてパラメーター型を設定します。実行時に、パラメーターの型がターゲット メソッドの型と一致しないことがあり、この場合は .NET CLR または JVM がデータを変換できないため例外が発生します。呼び出し元のプログラムと呼び出し先のプログラムの両方に NOILNATIVE 指令を指定することで、これを回避できます。
次のプログラムは、NOILNATIVE を使用してコンパイルする場合を示しています。
cmain.cbl
01 ws-data pic 9(4) comp-5. procedure division. call “csub” using ws-data.
csub.cbl
linkage section. 01 ls-data. 03 ls-value pic 9(4) comp-5. procedure division using ls-data. move 100 to ls-value. exit program.
次のようなコマンドを使用して、ILNATIVE のデフォルト設定で 2 つのプログラムを個別にコンパイルします。
cobol cmain jvmgen; cobol csub jvmgen(sub);
プログラム cmain を実行すると、ws-data および ls-data データ項目の型が異なるため、実行時に例外が発生します。
ただし、次のように両方のプログラムに NOILNATIVE 指令を指定すると、両方のデータ項目が同じタイプで表されるため、引数はサブプログラムに正常に渡されます。
cobol cmain jvmgen noilnative; cobol csub jvmgen(sub) noilnative;
説明:
マネージ プリミティブとして表される COBOL データ項目は、そうでない COBOL データ項目よりもはるかに高パフォーマンスです。ただし、動的呼び出しで呼び出し引数が一致しない場合や、プログラムが IL ネイティブ型として公開される項目を初期化する DEFAULTBYTE コンパイラ指令に依存している場合など、IL ネイティブ型の使用が適切でない場合があります。
これらの問題を回避するには、プログラムをコンパイルする際に NOILNATIVE 指令を指定します。