通例:
コンパイラは通常、ターゲット メソッドのシグネチャを調べることによって、呼び出し元のプログラムのパラメーターを適切な型に変換します。このシグネチャを使用できるのは、メソッドが呼び出し元のプログラムと同じソース モジュールにある場合や、ILSOURCE 指令で識別されるモジュールまたは ILREF 指令で識別されるアセンブリにある場合です。
呼び出し先のプログラムがコンパイル時に認識されていないか、実行時まで使用できない場合、呼び出し元のプログラムは CALL 文のデータ項目のみに基づいてパラメーター型を設定します。実行時に、パラメーターの型がターゲット メソッドの型と一致しないことがあり、この場合は .NET CLR または JVM がデータを変換できないため例外が発生します。呼び出し元のプログラムと呼び出し先のプログラムの両方に NOILNATIVE 指令を指定することで、これを回避できます。
>>-.----.---ILNATIVE---------->< | | +-NO-+
なし
デフォルト: | ILNATIVE |
IDE での相当機能: | なし。ILNATIVE は、[Project > Properties > COBOL] で追加コンパイラ指令として指定できます。 |
次のプログラムは、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;
説明:
.NET または Java プリミティブとして表される COBOL データ項目は、そうでない COBOL データ項目よりもはるかに高パフォーマンスです。ただし、動的呼び出しで呼び出し引数が一致しない場合や、IL ネイティブ型として公開される項目を初期化する DEFAULTBYTE コンパイラ指令にプログラムが依存している場合など、IL ネイティブ型の使用が適切でない場合があります。
これらの問題を回避するには、プログラムをコンパイルする際に NOILNATIVE 指令を指定します。