可能な場合に COBOL 01 レベルのデータ項目を .NET ネイティブ型として公開します。
次に、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 ilgen; cobol csub ilgen(sub);
プログラム cmain を実行すると、ws-data データ項目と ls-data データ項目の型が異なるために、実行時に ArgumentException が生成されます。
ただし、次のように、両方のプログラムに NOILNATIVE 指令を指定すると、両方のデータ項目が同じ型で表され、引数がサブプログラムに正しく渡されるようになります。
cobol cmain ilgen noilnative; cobol csub ilgen(sub) noilnative;
注釈:
IL ネイティブ型として表されている COBOL データ項目は、それ以外のデータ項目よりもかなり効率よく実行されます。ただし、状況によっては、IL ネイティブ型の使用が適さない場合もあります。たとえば、呼び出し引数が動的呼び出しに適合しない場合などです。
ILNATIVE を指定すると、次のようになります。
ILNATIVE を指定すると、通常、コンパイラでターゲット メソッドのシグネチャを調べることによって呼び出し元のプログラムのパラメーターが適切な型に変換されます。このシグネチャを使用できるのは、メソッドが呼び出し元のプログラムと同じソース モジュール、ILSOURCE 指令で指定されたモジュール、または ILREF 指令で指定されたアセンブリに含まれている場合です。
呼び出し先プログラムがコンパイル時にわからない場合、または実行時まで使用できない状態にある場合、呼び出し元のプログラムでは、CALL 文のデータ項目のみに基づいてパラメーターの型が設定されます。実行時には、パラメーターの型がターゲット メソッドのパラメーターの型と一致しない場合があります。この場合、データを変換できないため、.NET CLR で System.ArgumentException が生成されます。この問題を回避するには、呼び出し元のプログラムと呼び出し先プログラムの両方に NOILNATIVE 指令を指定します。