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. |
Explica cómo declara, usa y administra los tipos Common Language Runtime. |
|
Explica el mecanismo que utiliza Common Language Runtime para describir un tipo y para almacenar esa información con el tipo. |