(0) exportieren Drucken
Alle erweitern

ConnectionPoint-Klasse

Fungiert als Basisklasse zum Definieren von Verbindungspunktobjekten, sodass das Consumer-Steuerelement und das Anbietersteuerelement Daten in einer Webparts-Verbindung gemeinsam nutzen können.

Namespace: System.Web.UI.WebControls.WebParts
Assembly: System.Web (in system.web.dll)

public abstract class ConnectionPoint
public abstract class ConnectionPoint
public abstract class ConnectionPoint
Nicht zutreffend.

Jede Webparts-Verbindung besteht aus zwei Serversteuerelementen, die freigegebene Daten nutzen. Das eine Steuerelement ist der Consumer, das andere der Anbieter. Weitere Informationen zu den wesentlichen Komponenten einer Webparts-Verbindung und zum Verbindungsobjekt selbst finden Sie in der Übersicht zur WebPartConnection-Klasse. Für jede Webparts-Verbindung sind Verbindungspunkte erforderlich. Das Anbieter- und das Consumer-Steuerelement müssen jeweils mindestens ein definiertes ConnectionPoint-Objekt aufweisen (jedes kann wahlweise über mehrere Verbindungspunkte verfügen), das die Angaben enthält, wie ein Steuerelement mit einem anderen Steuerelement verbunden werden kann und welche Dateitypen freigegeben sind. In einer tatsächlichen Verbindung verfügt der Anbieter über einen eigenen Typ eines Verbindungspunktobjekts (abgeleitet aus der ConnectionPoint-Basisklasse), einen ProviderConnectionPoint. Ein Consumer verfügt ebenfalls über ein eigenes Objekt, eine ConsumerConnectionPoint-Instanz.

Die Entwickler müssen dem Anbieter eine Rückrufmethode hinzufügen, die eine implementierte Schnittstelleninstanz an den Consumer zurückgibt, um einen Anbieterverbindungspunkt zu erstellen. Sie müssen die Rückrufmethode im Quellcode mit einem ConnectionProvider-Codeattribut kennzeichnen. Weitere Informationen finden Sie unter der ConnectionProviderAttribute-Klasse. In ähnlicher Weise müssen die Entwickler zum Erstellen eines Consumer-Verbindungspunkts dem Consumer eine Methode hinzufügen, die eine Schnittstelleninstanz empfängt. Sie müssen diese Methode mit einem ConnectionConsumer-Attribut kennzeichnen. Weitere Informationen finden Sie unter der ConnectionConsumerAttribute-Klasse.

Wenn Entwickler Verbindungen auf einer Webseite erstellen, können diese als statische oder dynamische Verbindungen erstellt werden. Statische Verbindungen werden im Markup einer Webseite deklariert. Wenn eine statische Verbindung deklariert wird, können Entwickler kennzeichnen, welche Verbindungspunkte sowohl für den Anbieter als auch für den Consumer verwendet werden, indem dem ProviderConnectionPointID-Attribut und dem ConsumerConnectionPointID-Attribut innerhalb des <asp:webpartconnection>-Elementtags Werte zugewiesen werden. Diese Vorgehensweise ist besonders hilfreich, wenn es mehrere innerhalb der Consumer- und Anbietersteuerelemente definierte Verbindungspunkte gibt, denn dann kann die statische Verbindung bestimmen, welche Verbindungspunkte für die Verbindung verwendet werden sollen.

Dynamische Verbindungen werden programmgesteuert erstellt, durch Entwicklercode oder von den Benutzern über die Benutzeroberfläche, die vom ConnectionsZone-Steuerelement bereitgestellt wird. Entwickler müssen zum Erstellen einer Verbindung im Code eine Instanz eines WebPartConnection-Objekts abrufen, indem sie die ConnectWebParts-Methode im WebPartManager-Steuerelement aufrufen. Bevor sie diese Methode aufrufen können, müssen Entwickler über Verweise auf die Steuerelemente der Consumer- und Anbieterserver und auf ihre jeweiligen Verbindungspunktobjekte verfügen. Um diese Verweise auf die Verbindungspunkte für ein Anbieter- und ein Consumer-Steuerelement abzurufen, müssen Entwickler zunächst die GetProviderConnectionPoints-Methode und die GetConsumerConnectionPoints-Methode im WebPartManager-Steuerelement aufrufen. Diese Methoden geben die entsprechenden Verbindungspunktobjekte zurück, die wiederum an die Methode zum Erstellen einer Verbindung weitergegeben werden können.

Wenn sowohl das Anbieter- als auch das Consumer-Verbindungspunktobjekt den gleichen Schnittstellentyp verwenden, sind sie kompatibel und können eine direkte Verbindung zur Verwendung freigegebener Daten bilden. Wenn nicht der gleiche Schnittstellentyp verwendet wird, muss ein WebPartTransformer-Objekt verwendet werden, mit dem die Schnittstelleninstanz des Anbieters in einen Typ umgesetzt wird, mit dem der Consumer funktioniert.

Die abstrakte ConnectionPoint-Klasse stellt die Basisangaben der Verbindungspunkte bereit, die sowohl vom Consumer- als auch vom Anbietersteuerelement verwendet werden. Mehrere Eigenschaften enthalten diese Details. Die AllowsMultipleConnections-Eigenschaft zeigt an, ob ein Verbindungspunkt gleichzeitig an mehreren Verbindungen teilnehmen kann. Standardmäßig können Anbieterverbindungspunkte an mehreren Verbindungen teilnehmen, Consumer-Verbindungspunkte nicht. Die ControlType-Eigenschaft gibt den Typ eines dem Verbindungspunkt zugeordneten Serversteuerelements an. Beachten Sie, dass nicht nur WebPart-Steuerelemente Verbindungen bilden können. Jedes Serversteuerelement, ob es sich um ein ASP.NET-Steuerelement, ein benutzerdefiniertes oder ein Benutzersteuerelement handelt, kann in die Lage versetzt werden, an Verbindungen teilzunehmen, wenn es sich in einer WebPartZoneBase-Zone befindet. Die DisplayName-Eigenschaft stellt den angezeigten Namen für einen Verbindungspunkt bereit, der in der Benutzeroberfläche zur Unterstützung von Benutzern angezeigt werden kann, die Verbindungen erstellen. Die ID-Eigenschaft fungiert als Zeichenfolgenbezeichner für das Verbindungspunktobjekt selbst. Die InterfaceType-Eigenschaft gibt an, welchen Typ von Schnittstelleninstanz der Verbindungspunkt versteht. Ob ein bestimmter Verbindungspunkt eine Instanz dieser Schnittstelle bereitstellt oder verwendet, wird dadurch bestimmt, ob es sich um ein ProviderConnectionPoint-Objekt oder ein ConsumerConnectionPoint-Objekt handelt.

Die ConnectionPoint-Klasse verfügt über eine Methode. Die GetEnabled-Methode gibt einen booleschen Wert zurück, der angibt, ob ein Verbindungspunkt derzeit an Verbindungen teilnehmen kann.

Die ConnectionPoint-Klasse verfügt auch über ein öffentliches Feld, DefaultID. Dieses Feld enthält einen Wert, mit dem der Standardverbindungspunkt in einer Verbindung identifiziert wird.

HinweisHinweis:

Die Attribute, mit denen Verbindungspunktmethoden angegeben werden, weisen nur einen erforderlichen Parameter (displayName) auf. Deshalb kann der Standardverbindungspunkt erstellt werden, ohne eine ID anzugeben. In diesen Fällen stellt das DefaultID-Feld einen zu verwendenden Basiswert bereit.

Im folgenden Codebeispiel wird das Erstellen einer Webparts-Verbindung mit den erforderlichen ConnectionPoint-Objekten veranschaulicht. Da es sich bei der ConnectionPoint-Klasse um eine abstrakte Basisklasse handelt, sind die Instanzen ihrer untergeordneten Klassen (ProviderConnectionPoint und ConsumerConnectionPoint) die tatsächlich verwendeten Objekte zur Bildung einer Verbindung.

Das Beispiel besteht aus vier Teilen:

  • Einem Benutzersteuerelement, mit dessen Hilfe Sie den Anzeigemodus auf einer Webparts-Seite wechseln können.

  • Quellcode für eine Schnittstelle und zwei WebPart-Steuerelementen, die als Anbieter und Consumer für eine Verbindung fungieren.

  • Einer Webseite, um alle Steuerelemente zu hosten und das Codebeispiel auszuführen.

  • Einer Erklärung, wie die Beispielseite ausgeführt wird.

Beim ersten Teil dieses Codebeispiels handelt es sich um das Benutzersteuerelement, mit dem der Anzeigemodus auf einer Webseite geändert werden kann. Speichern Sie den folgenden Quellcode in einer ASCX-Datei. Geben Sie dieser den Dateinamen, der dem Src-Attribut der Register-Direktive für dieses Benutzersteuerelement zugewiesen ist, die sich im oberen Bereich der hostenden Webseite befindet. Ausführliche Informationen zu Anzeigemodi und eine Beschreibung des Quellcodes in diesem Steuerelement finden Sie unter Exemplarische Vorgehensweise: Wechseln des Anzeigemodus auf einer Webparts-Seite.

<%@ control language="C#" classname="DisplayModeMenuCS"%>
<script runat="server">
  
 // Use a field to reference the current WebPartManager.
  WebPartManager _manager;

  void Page_Init(object sender, EventArgs e)
  {
    Page.InitComplete += new EventHandler(InitComplete);
  }  

  void InitComplete(object sender, System.EventArgs e)
  {
    _manager = WebPartManager.GetCurrentWebPartManager(Page);

    String browseModeName = WebPartManager.BrowseDisplayMode.Name;

    // Fill the dropdown with the names of supported display modes.
    foreach (WebPartDisplayMode mode in _manager.SupportedDisplayModes)
    {
      String modeName = mode.Name;
      // Make sure a mode is enabled before adding it.
      if (mode.IsEnabled(_manager))
      {
        ListItem item = new ListItem(modeName, modeName);
        DisplayModeDropdown.Items.Add(item);
      }
    }

    // If shared scope is allowed for this user, display the scope-switching
    // UI and select the appropriate radio button for the current user scope.
    if (_manager.Personalization.CanEnterSharedScope)
    {
      Panel2.Visible = true;
      if (_manager.Personalization.Scope == PersonalizationScope.User)
        RadioButton1.Checked = true;
      else
        RadioButton2.Checked = true;
    }
    
  }
 
  // Change the page to the selected display mode.
  void DisplayModeDropdown_SelectedIndexChanged(object sender, EventArgs e)
  {
    String selectedMode = DisplayModeDropdown.SelectedValue;

    WebPartDisplayMode mode = _manager.SupportedDisplayModes[selectedMode];
    if (mode != null)
      _manager.DisplayMode = mode;
  }

  // Set the selected item equal to the current display mode.
  void Page_PreRender(object sender, EventArgs e)
  {
    ListItemCollection items = DisplayModeDropdown.Items;
    int selectedIndex = 
      items.IndexOf(items.FindByText(_manager.DisplayMode.Name));
    DisplayModeDropdown.SelectedIndex = selectedIndex;
  }

  // Reset all of a user's personalization data for the page.
  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    _manager.Personalization.ResetPersonalizationState();
  }

  // If not in User personalization scope, toggle into it.
  protected void RadioButton1_CheckedChanged(object sender, EventArgs e)
  {
    if (_manager.Personalization.Scope == PersonalizationScope.Shared)
      _manager.Personalization.ToggleScope();
  }

  // If not in Shared scope, and if user is allowed, toggle the scope.
  protected void RadioButton2_CheckedChanged(object sender, EventArgs e)
  {
    if (_manager.Personalization.CanEnterSharedScope && 
        _manager.Personalization.Scope == PersonalizationScope.User)
      _manager.Personalization.ToggleScope();
  }
</script>
<div>
  <asp:Panel ID="Panel1" runat="server" 
    Borderwidth="1" 
    Width="230" 
    BackColor="lightgray"
    Font-Names="Verdana, Arial, Sans Serif" >
    <asp:Label ID="Label1" runat="server" 
      Text="&nbsp;Display Mode" 
      Font-Bold="true"
      Font-Size="8"
      Width="120" 
      AssociatedControlID="DisplayModeDropdown"/>
    <asp:DropDownList ID="DisplayModeDropdown" runat="server"  
      AutoPostBack="true" 
      Width="120"
      OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" />
    <asp:LinkButton ID="LinkButton1" runat="server"
      Text="Reset User State" 
      ToolTip="Reset the current user's personalization data for the page."
      Font-Size="8" 
      OnClick="LinkButton1_Click" />
    <asp:Panel ID="Panel2" runat="server" 
      GroupingText="Personalization Scope"
      Font-Bold="true"
      Font-Size="8" 
      Visible="false" >
      <asp:RadioButton ID="RadioButton1" runat="server" 
        Text="User" 
        AutoPostBack="true"
        GroupName="Scope" OnCheckedChanged="RadioButton1_CheckedChanged" />
      <asp:RadioButton ID="RadioButton2" runat="server" 
        Text="Shared" 
        AutoPostBack="true"
        GroupName="Scope" 
        OnCheckedChanged="RadioButton2_CheckedChanged" />
    </asp:Panel>
  </asp:Panel>
</div>

Der zweite Teil des Codebeispiels ist der Quellcode für die Schnittstelle und die Steuerelemente. Die Quelldatei enthält die einfache Schnittstelle IZipCode. Außerdem gibt es eine WebPart-Klasse (ZipCodeWebPart), die die Schnittstelle implementiert und als Anbietersteuerelement fungiert. Die ProvideIZipCode-Methode ist die Rückrufmethode, die den einzigen Member der Schnittstelle implementiert. Die Methode gibt eine Instanz der Schnittstelle zurück. Beachten Sie, dass die Metadaten der Methode mit einem ConnectionProvider-Attribut markiert werden. Auf diese Weise wird die Methode als Rückrufmethode für den Verbindungspunkt des Anbieters identifiziert. Die andere WebPart-Klasse (WeatherWebPart) fungiert als Consumer für die Verbindung. Diese Klasse verfügt über die Methode GetZipCode, die eine Instanz der IZipCode-Schnittstelle aus dem Anbietersteuerelement abruft. Beachten Sie, dass diese Methode durch das ConnectionConsumer-Attribut in ihren Metadaten als Verbindungspunktmethode für den Consumer gekennzeichnet ist. Dies ist der Mechanismus zum Identifizieren der Verbindungspunktmethode im Consumersteuerelement.

Um das Codebeispiel auszuführen, müssen Sie diesen Quellcode kompilieren. Sie können den Code explizit kompilieren und die sich ergebende Assembly im Ordner Bin der Website oder im globalen Assemblycache ablegen. Alternativ können Sie den Quellcode im Ordner App_Code der Site ablegen, wo er zur Laufzeit dynamisch kompiliert wird. In diesem Codebeispiel wird die dynamische Kompilierung verwendet. Eine exemplarische Vorgehensweise, in der die Kompilierung erläutert wird, finden Sie unter Exemplarische Vorgehensweise: Entwickeln und Verwenden eines benutzerdefinierten Serversteuerelements.

namespace Samples.AspNet.CS.Controls
{
  using System;
  using System.Web;
  using System.Web.Security;
  using System.Security.Permissions;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.WebParts;

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public interface IZipCode
  {
    string ZipCode { get; set;}
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class ZipCodeWebPart : WebPart, IZipCode
  {
    string zipCodeText = String.Empty;
    TextBox input;
    Button send;

    public ZipCodeWebPart()
    {
    }

    // Make the implemented property personalizable to save 
    // the Zip Code between browser sessions.
    [Personalizable()]
    public virtual string ZipCode
    {
      get { return zipCodeText; }
      set { zipCodeText = value; }
    }

    // This is the callback method that returns the provider.
    [ConnectionProvider("Zip Code Provider", "ZipCodeProvider")]
    public IZipCode ProvideIZipCode()
    {
      return this;
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      input = new TextBox();
      this.Controls.Add(input);
      send = new Button();
      send.Text = "Enter 5-digit Zip Code";
      send.Click += new EventHandler(this.submit_Click);
      this.Controls.Add(send);
    }

    private void submit_Click(object sender, EventArgs e)
    {
      if (input.Text != String.Empty)
      {
        zipCodeText = Page.Server.HtmlEncode(input.Text);
        input.Text = String.Empty;
      }
    }

  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class WeatherWebPart : WebPart
  {
    private IZipCode _provider;
    string _zipSearch;
    Label DisplayContent;

    // This method is identified by the ConnectionConsumer 
    // attribute, and is the mechanism for connecting with 
    // the provider. 
    [ConnectionConsumer("Zip Code Consumer", "ZipCodeConsumer")]
    public void GetIZipCode(IZipCode Provider)
    {
      _provider = Provider;
    }
    
    protected override void OnPreRender(EventArgs e)
    {
      EnsureChildControls();

      if (this._provider != null)
      {
        _zipSearch = _provider.ZipCode.Trim();
        DisplayContent.Text = "My Zip Code is:  " + _zipSearch;
      }
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      DisplayContent = new Label();
      this.Controls.Add(DisplayContent);
    }

  }
}

Der dritte Teil des Codebeispiels ist die Webseite. Im oberen Bereich befinden sich die Register-Direktiven, mit denen die benutzerdefinierten Steuerelemente registriert werden können, die die Verbindung bilden, sowie das Benutzersteuerelement, mit dem der Benutzer die Anzeigemodi auf der Seite wechseln kann. Die Verbindung selbst wird innerhalb des <staticconnections>-Elements auf der Seite deklarativ erstellt. Sie können die Verbindung auch programmgesteuert erstellen. Der Code dafür findet sich in der Button1_Click-Methode. Unabhängig davon, ob die Verbindung deklarativ oder programmgesteuert erstellt wird, müssen Verbindungspunkte immer sowohl für den Anbieter als auch für den Consumer angegeben werden. Die Button2_Click-Methode greift auf die ConnectionPoint-Objekte sowohl für den Anbieter als auch für den Consumer zu und schreibt einige ihrer Eigenschaftenwerte in eine Bezeichnung auf der Seite.

<%@ Page Language="C#" %>
<%@ register tagprefix="uc1" 
    tagname="DisplayModeMenuCS"
    src="~/displaymodemenucs.ascx" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  protected void Button1_Click(object sender, EventArgs e)
  {
    ProviderConnectionPoint provPoint =
      mgr.GetProviderConnectionPoints(zip1)["ZipCodeProvider"];
    ConsumerConnectionPoint connPoint =
      mgr.GetConsumerConnectionPoints(weather1)["ZipCodeConsumer"];
      
    if(mgr.CanConnectWebParts(zip1, provPoint, weather1, connPoint))
      mgr.ConnectWebParts(zip1, provPoint, weather1, connPoint);
  
  }  
  protected void Button2_Click(object sender, EventArgs e)
  {
    WebPartConnection conn = mgr.Connections[0];
    
    lblConn.Text = "<h2>Connection Point Details</h2>" + 
       "<h3>Provider Connection Point</h3>" + 
       "  Display name: " + conn.ProviderConnectionPoint.DisplayName + 
       "<br />" + 
       "  ID: " + conn.ProviderConnectionPoint.ID + 
       "<br />" + 
       "  Interface type: " + 
        conn.ProviderConnectionPoint.InterfaceType.ToString() + 
       "<br />" + 
       "  Control type: " + conn.ProviderConnectionPoint.ControlType.ToString() + 
       "<br />" + 
       "  Allows multiple connections: " + 
          conn.ProviderConnectionPoint.AllowsMultipleConnections.ToString() + 
       "<br />" + 
       "  Enabled: " + conn.ProviderConnectionPoint.GetEnabled(zip1).ToString() + 
       "<hr />" + 
       "<h3>Consumer Connection Point</h3>" + 
       "  Display name: " + conn.ConsumerConnectionPoint.DisplayName + 
       "<br />" + 
       "  ID: " + conn.ConsumerConnectionPoint.ID + 
       "<br />" + 
       "  Interface type: " + conn.ConsumerConnectionPoint.InterfaceType.ToString() + 
       "<br />" + 
       "  Control type: " + conn.ConsumerConnectionPoint.ControlType.ToString() + 
       "<br />" + 
       "  Allows multiple connections: " + 
          conn.ConsumerConnectionPoint.AllowsMultipleConnections.ToString() + 
       "<br />" + 
       "  Enabled: " + conn.ConsumerConnectionPoint.GetEnabled(zip1).ToString();
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    lblConn.Text = String.Empty;
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr" runat="server" >
        <StaticConnections>
          <asp:WebPartConnection ID="conn1"
            ConsumerConnectionPointID="ZipCodeConsumer"
            ConsumerID="weather1" 
            ProviderConnectionPointID="ZipCodeProvider" 
            ProviderID="zip1" />
        </StaticConnections>      
      </asp:WebPartManager>
      <uc1:displaymodemenucs id="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider"  />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server">
      </asp:ConnectionsZone>
      <asp:Button ID="Button1" runat="server" 
        Text="Dynamic Connection" 
        OnClick="Button1_Click" />      
      <br />
      <asp:Button ID="Button2" runat="server" 
        Text="Connection Point Details" 
        OnClick="Button2_Click" />
      <br />
      <asp:Label ID="lblConn" runat="server" />
    </div>
    </form>
</body>
</html>

Nachdem Sie die Seite in einen Browser geladen haben, klicken Sie auf die Schaltfläche Verbindungspunktdetails. Informationen zu den in der deklarativen Verbindung erstellten Anbieter- und Consumerverbindungspunkten werden angezeigt. Schalten Sie die Seite danach mithilfe des Dropdown-Steuerelements Display Mode in den richtigen Modus um. Klicken Sie im Verbenmenü eines der WebPart-Steuerelemente (in der Titelleiste dargestellt durch einen Pfeil nach unten) auf das Verbinden-Verb. Die von dem in der Seite deklarierten <asp:connectionszone>-Steuerelement automatisch erstellte Verbindungsbenutzeroberfläche wird angezeigt. Klicken Sie auf die Schaltfläche Verbindung trennen, um die vorhandene Verbindung zu beenden. Versetzen Sie die Seite mithilfe des Display Mode-Steuerelements wieder in den Durchsuchen-Modus. Klicken Sie dann auf die Schaltfläche Dynamische Verbindung, um eine Verbindung programmgesteuert zu erstellen. Klicken Sie erneut auf die Schaltfläche Verbindungspunktdetails, um Details über die zwei Verbindungspunktobjekte anzuzeigen.

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

Microsoft .NET Framework 3.0 wird unter Windows Vista, Microsoft Windows XP SP2 und Windows Server 2003 SP1 unterstützt.

.NET Framework

Unterstützt in: 3.0, 2.0
Anzeigen:
© 2014 Microsoft