言語間の相互運用性

言語に依存しないということは、いくつか意味があります。 たとえば、ある言語で記述された型を、別の言語で記述されたアプリからシームレスに利用することができます。これについては、記事「Language Independence and Language-Independent Components (言語非依存性と言語に依存しないコンポーネント)」で説明しました。 また、複数の言語で記述されたコードを 1 つの .NET .NET Framework アセンブリにまとめることもできます。ここでは、この点について焦点を当てて説明します。

次の例では、NumericLib および StringLib という 2 つのクラスを含む Utilities.dll という名前のクラス ライブラリを作成して言語間の相互運用性を示します。 NumericLib クラスは C# で記述され、StringLib クラスは Visual Basic で記述されています。 以下は StringUtil.vb のソース コードで、StringLib クラスに ToTitleCase という単一のメンバーが含まれます。

Imports System.Collections.Generic
Imports System.Runtime.CompilerServices

Public Module StringLib
   Private exclusions As List(Of String) 

   Sub New()
      Dim words() As String = { "a", "an", "and", "of", "the" }
      exclusions = New List(Of String)
      exclusions.AddRange(words)
   End Sub

   <Extension()> _
   Public Function ToTitleCase(title As String) As String
      Dim words() As String = title.Split() 
      Dim result As String = String.Empty

      For ctr As Integer = 0 To words.Length - 1
         Dim word As String = words(ctr)
         If ctr = 0 OrElse Not exclusions.Contains(word.ToLower()) Then
            result += word.Substring(0, 1).ToUpper() + _
                      word.Substring(1).ToLower()
         Else
            result += word.ToLower()
         End If
         If ctr <= words.Length - 1 Then
            result += " "             
         End If   
      Next 
      Return result 
   End Function
End Module

以下は NumberUtil.cs のソース コードで、IsEven および NearZero という 2 つのメンバーを持つ NumericLib クラスを定義しています。

using System;

public static class NumericLib 
{
   public static bool IsEven(this IConvertible number)
   {
      if (number is Byte ||
          number is SByte ||
          number is Int16 ||
          number is UInt16 || 
          number is Int32 || 
          number is UInt32 ||
          number is Int64)
         return ((long) number) % 2 == 0;
      else if (number is UInt64)
         return ((ulong) number) %2 == 0;
      else
         throw new NotSupportedException("IsEven called for a non-integer value.");
   }

   public static bool NearZero(double number)
   {
      return number < .00001; 
   }
}

単一のアセンブリに 2 つのクラスをパッケージ化するには、モジュールにコンパイルする必要があります。 Visual Basic のソース コード ファイルをモジュールにコンパイルするには、次のコマンドを使用します。

vbc /t:module StringUtil.vb 

Visual Basic コンパイラのコマンド ライン構文の詳細については、「コマンド ラインからのビルド (Visual Basic)」を参照してください。

C# のソース コード ファイルをモジュールにコンパイルするには、次のコマンドを使用します。

csc /t:module NumberUtil.cs

C# コンパイラのコマンド ライン構文の詳細については、「csc.exe を使用したコマンド ラインからのビルド」を参照してください。

次に、リンク ツール (Link.exe) を使用してアセンブリに 2 つのモジュールをコンパイルします。

link numberutil.netmodule stringutil.netmodule /out:UtilityLib.dll /dll 

次の例では、その後 NumericLib.NearZero メソッドおよび StringLib.ToTitleCase メソッドを呼び出します。 Visual Basic コードと C# コードは、両方のクラスのメソッドにアクセスできることに注意してください。

Module Example
   Public Sub Main()
      Dim dbl As Double = 0.0 - Double.Epsilon
      Console.WriteLine(NumericLib.NearZero(dbl))

      Dim s As String = "war and peace"
      Console.WriteLine(s.ToTitleCase())
   End Sub
End Module
' The example displays the following output:
'       True
'       War and Peace
using System;

public class Example
{
   public static void Main()
   {
      Double dbl = 0.0 - Double.Epsilon;
      Console.WriteLine(NumericLib.NearZero(dbl));

      string s = "war and peace";
      Console.WriteLine(s.ToTitleCase());
   }
}
// The example displays the following output:
//       True
//       War and Peace

Visual Basic コードをコンパイルするには、次のコマンドを使用します。

vbc example.vb /r:UtilityLib.dll

C# でコンパイルするには、コンパイラの名前を vbc から csc に変更し、ファイル拡張子を .vb から .cs に変更します。

csc example.cs /r:UtilityLib.dll

関連トピック

タイトル

説明

言語への非依存性、および言語非依存コンポーネント

任意の言語で記述されたアプリが使用できる CLS 準拠のソフトウェア コンポーネントを作成する方法について説明します。

共通型システム

共通言語ランタイムで型を宣言したり、使用したり、管理したりする方法について説明します。

メタデータと自己言及的なコンポーネント

共通言語ランタイムで型を記述し、記述した情報をその型と共に格納する機構について説明します。