Compartir a través de


Interoperabilidad entre lenguajes

La independencia de lenguaje tiene varios significados posibles. Un significado, descrito en el artículo sobre la independencia de lenguaje y los componentes independientes del lenguaje, implica el uso sin problemas de tipos escritos en un lenguaje desde una aplicación escrita en otro lenguaje. Un segundo significado, que es el descrito en este artículo, implica combinar código escrito en varios lenguajes en un único ensamblado de .NET Framework.

El ejemplo siguiente muestra la interoperabilidad entre lenguajes creando una biblioteca de clases de denominada Utilities.dll que incluye dos clases, NumericLib y StringLib. La clase NumericLib está escrita en C#, y la clase StringLib está escrita en Visual Basic. A continuación se muestra el código fuente para StringUtil.vb, que incluye un solo miembro, ToTitleCase, en su clase StringLib.

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

A continuación se muestra el código fuente para NumberUtil.cs, que define una clase NumericLib con dos miembros, IsEven y NearZero.

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; 
   }
}

Para empaquetar las dos clases en un solo ensamblado, debe compilarlas en módulos. Para compilar el archivo de código fuente de Visual Basic en un módulo, use este comando:

vbc /t:module StringUtil.vb 

Para obtener más información sobre la sintaxis de la línea de comandos del compilador de Visual Basic, vea Compilar desde la línea de comandos (Visual Basic).

Para compilar el archivo de código fuente de C# en un módulo, use este comando:

csc /t:module NumberUtil.cs

Para obtener más información sobre la sintaxis de la línea de comandos del compilador de C#, vea Compilar la línea de comandos con csc.exe.

A continuación, use la herramienta de vinculación (Link.exe) para compilar los dos módulos en un ensamblado:

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

El ejemplo siguiente llama a los métodos NumericLib.NearZero y StringLib.ToTitleCase. Observe que el código de Visual Basic y el código de C# pueden tener acceso a los métodos en ambas clases.

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

Para compilar el código de Visual Basic, use este comando:

vbc example.vb /r:UtilityLib.dll

Para compilar con C#, cambie el nombre del compilador de vbc a csc y cambie la extensión de archivo .vb a .cs:

csc example.cs /r:UtilityLib.dll

Temas relacionados

Título

Descripción

Independencia del lenguaje y componentes independientes del lenguaje

Explica cómo crear componentes de software conformes a CLS que pueden usar otras aplicaciones escritas en cualquier lenguaje.

Sistema de tipos comunes

Explica cómo declara, usa y administra los tipos Common Language Runtime.

Metadatos y componentes autodescriptivos

Explica el mecanismo que utiliza Common Language Runtime para describir un tipo y para almacenar esa información con el tipo.