Sprachübergreifende Interoperabilität
Der Begriff "Sprachenunabhängigkeit" kann mehrere Bedeutungen haben. Eine Bedeutung, die im Artikel Sprachenunabhängigkeit und sprachunabhängige Komponenten erläutert wird, bezeichnet die nahtlose Nutzung von Typen, die in einer Sprache geschrieben wurden, durch eine App, die in einer anderen Sprache geschrieben wurde. Eine zweite Bedeutung, die in diesem Artikels hervorgehoben wird, umfasst die Kombination von Code aus mehreren Sprachen in einer einzelnen .NET Framework-Assembly.
Das folgende Beispiel veranschaulicht die sprachübergreifende Interoperabilität. Es wird die Klassenbibliothek Utilities.dll erstellt, die zwei Klassen einschließt: NumericLib und StringLib. Die NumericLib-Klasse wurde in C# und die StringLib-Klasse in Visual Basic geschrieben. Im Folgenden sehen Sie den Quellcode für "StringUtil.vb", der in der StringLib-Klasse einen einzelnen Member enthält, 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
Im Folgenden sehen Sie den Quellcode für "NumberUtil.cs", der eine NumericLib-Klasse mit zwei Membern definiert: IsEven und 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;
}
}
Um die beiden Klassen in einer einzelnen Assembly zu verpacken, müssen Sie sie in Module kompilieren. Verwenden Sie zum Kompilieren der Visual Basic-Quellcodedatei in einem Modul folgenden Befehl:
vbc /t:module StringUtil.vb
Weitere Informationen zur Befehlszeilensyntax des Visual Basic-Compilers finden Sie unter Erstellen von der Befehlszeile aus (Visual Basic).
Verwenden Sie zum Kompilieren der C#-Quellcodedatei in einem Modul folgenden Befehl:
csc /t:module NumberUtil.cs
Weitere Informationen zur Befehlszeilensyntax des C#-Compilers finden Sie unter Erstellen über die Befehlszeile mit csc.exe.
Verwenden Sie dann das Linktool (Link.exe), um die beiden Module in eine Assembly zu kompilieren:
link numberutil.netmodule stringutil.netmodule /out:UtilityLib.dll /dll
Das folgende Beispiel ruft dann die NumericLib.NearZero-Methode und die StringLib.ToTitleCase-Methode auf. Beachten Sie, dass sowohl der Visual Basic-Code als auch der C#-Code auf die Methoden in beiden Klassen zugreifen können.
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
Verwenden Sie zum Kompilieren des Visual Basic-Codes folgenden Befehl:
vbc example.vb /r:UtilityLib.dll
Zum Kompilieren mit C# ändern Sie den Namen des Compilers von vbc auf csc und die Dateierweiterung von ".vb" auf ".cs".
csc example.cs /r:UtilityLib.dll
Verwandte Themen
Titel |
Beschreibung |
---|---|
Erläutert, wie CLS-kompatible Softwarekomponenten erstellt werden, die von Apps unabhängig von der Programmiersprache, in der sie geschrieben wurden, genutzt werden können. |
|
Beschreibt, wie Typen von der Common Language Runtime deklariert, verwendet und verwaltet werden. |
|
Erklärt den Mechanismus, mit dem die Common Language Runtime einen Typ beschreibt und diese Informationen mit dem Typ selbst speichert. |