Partager via


Procédure : créer un adaptateur mobile

Dernière modification : jeudi 17 mars 2011

S’applique à : SharePoint Foundation 2010

Cette rubrique explique comment créer une classe d'adaptateur mobile qui rend un composant WebPart sur une page Microsoft SharePoint Foundation accessible aux appareils mobiles.

Pour obtenir un exemple concret de l'adaptation d'un composant WebPart, consultez Démonstration : création d’un adaptateur mobile.

Configurer votre environnement de développement

Tâches de développement prérequises

  1. Si les pages des composants WebPart que vous voulez rendre accessibles aux appareils mobiles n’existent pas déjà, vous devez les créer. Pour plus d’informations, voir Infrastructure de composant WebPart dans SharePoint Foundation et WebPartPage.

    Notes

    Vous ne créez pas les pages de la classe WebPartMobilePage. Celles-ci sont créées par le runtime quand un appareil mobile demande une page de composants WebPart (WebPartPage).

  2. Si les pages des composants WebPart que vous voulez rendre accessibles aux appareils mobiles n'existent pas déjà, vous devez les créer. Pour plus d'informations, consultez Infrastructure de composant WebPart dans SharePoint Foundation et Vue d'ensemble des composants WebPart.

Créer et déployer une classe d'adaptateur mobile

  1. Dans un projet de bibliothèque de classes Visual Studio, ajoutez une référence à System.Web puis à Microsoft.SharePoint.dll, et ajoutez une instruction using (Imports dans Visual Basic) pour l'espace de noms Microsoft.SharePoint.WebPartPages. Vous pourriez avoir besoin d'ajouter des instructions using pour d'autres espaces de noms en fonction des détails d'implémentation de votre adaptateur. En règle générale, les adaptateurs mobiles effectuent des appels aux types dans System.Web.UI.MobileControls, Microsoft.SharePoint et Microsoft.SharePoint.MobileControls.

  2. Ajoutez une classe nommée WebPartClassMobileAdapter, où WebPartClass est le nom du composant WebPart que vous adaptez. Par exemple, si le composant WebPart est StockListWebPart, nommez la classe adaptateur StockListWebPartMobileAdapter. Définissez-la de façon à hériter de WebPartMobileAdapter.

  3. Définissez l'espace de noms en conformité avec les lignes directrices indiquées dans Namespace Naming Guidelines (éventuellement en anglais). Pour un adaptateur mobile, utilisez quelque chose comme MyCompany.SharePoint.WebPartPages.MobileAdapters.

  4. Bien que la propriété WebPartMobileAdapter.Control ne soit pas marquée virtual or override (Overridable et Overrides dans Visual Basic), vous devrez peut-être la substituer efficacement en la masquant et en la remplaçant. Pour ce faire, déclarez la propriété Control dans votre classe dérivée en utilisant le mot clé new (Shadows dans Visual Basic). Pour plus d'informations sur les raisons qui peuvent vous inciter à agir ainsi et sur la façon de procéder, consultez la rubrique de référence pour WebPartMobileAdapter.Control.

  5. Substituez la méthode CreateControlsForSummaryView() si l'implémentation par défaut n'est pas appropriée pour l'accès mobile au composant WebPart. À la base, une substitution doit créer les contrôles enfants éventuellement requis et les ajouter à la collection Controls dans l'ordre selon lequel ils doivent apparaître sur un appareil. En principe, vous souhaiterez obtenir une petite icône et un titre pour le composant WebPart qui apparaît dans la vue de résumé sur un appareil mobile. (Si c'est tout ce que voulez voir apparaître dans la vue de résumé, alors vous n'avez pas besoin de substituer CreateControlsForSummaryView().) Deux méthodes d'assistance sont fournies pour faciliter cette procédure : CreateWebPartIcon(WebPartMobileAdapter.WebPartIconLink) and CreateWebPartLabel().

    Parfois, des informations supplémentaires sont nécessaires, même si la vue de résumé. Par exemple, supposons que le composant WebPart qui est adapté dispose de plusieurs éléments enfants qui appartiennent tous au même type. Vous pouvez ajouter un chiffre du nombre total d'enfant dans la vue de résumé avec un contrôle Label qui suit l'icône et le titre. Le code ci-après indique comment effectuer cette opération.

    Important

    Cet exemple est bâti sur deux hypothèses : la première, le composant WebPart qui est adapté a une propriété Count, de type String, qui retourne le nombre total d'éléments enfants ; et, la seconde, est que cette propriété est accessible, car la propriété Control a été masquée et remplacée comme indiqué dans l'étape précédente.

    protected override void CreateControlsForSummaryView()
    {
        Image iconImage = this.CreateWebPartIcon(WebPartIconLink.LinkToDetailView);
        iconImage.BreakAfter = false;
        this.Controls.Add(iconImage);
    
        Label titleLabel = this.CreateWebPartLabel();
        titleLabel.BreakAfter = false;
        this.Controls.Add(titleLabel);
    
        Label count = new Label() { Text=this.Control.Count.ToString() }
        this.Controls.Add(count);
    }
    
    Protected Overrides Sub CreateControlsForSummaryView()
            Dim iconImage As Image = Me.CreateWebPartIcon(WebPartIconLink.LinkToDetailView)
            iconImage.BreakAfter = False
            Me.Controls.Add(iconImage)
    
            Dim titleLabel As Label = Me.CreateWebPartLabel()
            titleLabel.BreakAfter = False
            Me.Controls.Add(titleLabel)
    
            Dim count As New Label() With {.Text=Me.Control.Count.ToString()} 
            Me.Controls.Add(count)
    End Sub
    

    Notez que lorsque la méthode CreateWebPartIcon(WebPartMobileAdapter.WebPartIconLink) est passée LinkToDetailView comme c'est le cas dans cet exemple, alors, à condition que le navigateur sur l'appareil prenne en charge CSS et ECMAScript 1.0 ou version supérieure, il affiche une icône en pointe de flèche qui fonctionne comme un contrôle cliquable qui exécute le script de développement de SharePoint Foundation Mobile Adapter Framework. Quand un utilisateur clique dessus, le composant WebPart se développe en vue détaillée et l'icône devient une flèche pointée vers le bas (qui est elle-même un contrôle qui exécute le script de réduction). Si le navigateur ne prend pas en charge à la fois CSS et ECMAScript 1.0 ou version supérieure, alors une icône différente est affichée et le fait de cliquer dessus permet à l'utilisateur d'accéder à une page (mblwpdetail.aspx) composée d'une vue détaillée du composant WebPart. Si vous ne souhaitez pas que le composant WebPart présente une vue détaillée sur les pages mobiles, passez plutôt NoLink à CreateWebPartIcon(WebPartMobileAdapter.WebPartIconLink).

    Autres choses que vous pourriez souhaiter faire dans le cadre d'une substitution de CreateControlsForSummaryView() :

    • Si votre logique d'affichage suppose que certaines entités ne sont pas null ou suppose que d'autres conditions sont True, pensez à concevoir votre substitution de façon à tester les hypothèses et soit ne rien faire soit fournir un affichage alternatif, quand les conditions ne sont pas True. Par exemple, si le composant WebPart que vous adaptez affiche une vue sous forme de liste, vous pouvez vérifier si la vue est conçue comme une vue mobile en testant this.Control.View.MobileView. Pour plus d'informations, consultez MobileView.

    • Si le composant WebPart que vous adaptez a des aspects visibles qui ne sont pas repris juste par une icône et un titre, pensez à en construire de petites versions pour la vue de résumé. Par exemple, si un graphique circulaire fait partie d'un composant WebPart, votre substitution de CreateControlsForSummaryView() pourrait inclure une petite image d'un graphique circulaire ; ou si le composant WebPart inclut une photographie, votre substitution pourrait inclure une très petite version mise à l'échelle de l'image.

  6. Substituez la méthode CreateControlsForDetailView() si l'implémentation par défaut n'est pas appropriée pour l'accès mobile à ce composant WebPart. L'implémentation par défaut affiche une icône et un titre pour un composant WebPart suivis d'un message indiquant qu'il n'existe pas de vue détaillée du composant WebPart. Si vous avez substitué CreateControlsForSummaryView() et ne souhaitez pas fournir une vue détaillée, substituez CreateControlsForDetailView() et faites en sorte qu'elle n'exécute aucune action, comme illustré dans l'exemple suivant.

    protected override void CreateControlsForDetailView(){}
    
    Protected Overrides Sub CreateControlsForDetailView()
    End Sub
    

    Si vous voulez une vue détaillée, le processus de substitution de CreateControlsForDetailView() est le même que pour CreateControlsForSummaryView(), sauf que vous affichez plus de détails du composant WebPart. Par exemple, si le composant WebPart a plusieurs éléments enfants, pensez à afficher les premiers éléments dans la vue de détail. Dans l'exemple de code suivant, la méthode CreateControlsForDetailView() est substituée pour afficher jusqu'à trois éléments de la liste actuelle en tant qu'enfants sous l'icône et le titre du composant WebPart. Vous trouverez une description plus détaillée de ce code dans Démonstration : création d’un adaptateur mobile.

    protected override void CreateControlsForDetailView()
    {
        Image iconImage = this.CreateWebPartIcon(WebPartIconLink.LinkToSummaryView);
        iconImage.BreakAfter = false;
        this.Controls.Add(iconImage);
    
        Label titleLabel = this.CreateWebPartLabel();
        this.Controls.Add(titleLabel);
    
        SPSite siteCollection = SPContext.Current.Site;
        SPUser currentUser = SPContext.Current.Web.CurrentUser;
        SPList taskList = siteCollection.AllWebs["MyGPSite"].Lists["Tasks"];
        SPListItemCollection allTasks = taskList.GetItems(taskList.DefaultView);
    
        // Use LINQ to filter out other users ... 
        var lightweightTasksOfUser = from SPListItem task in allTasks
                                     where task["AssignedTo"].ToString().EndsWith(currentUser.Name)
                                     select new {task.Title, Priority=task["Priority"]}; // ... and unneeded columns.
    
        Int16 itemCount = 1;
        foreach (var lightweightTask in lightweightTasksOfUser)
        {
            Image taskIcon = new Image() { ImageUrl = this.ItemBulletIconUrl,
                                           BreakAfter = false};
            this.Controls.Add(taskIcon);
    
            Label taskTitle = new Label { Text = lightweightTask.Title,
                                          BreakAfter = false};
            taskTitle.Font.Bold = BooleanOption.True;
            this.Controls.Add(taskTitle);
    
            Label priority = new Label() { Text = " " + lightweightTask.Priority };
            priority.Font.Size = FontSize.Small; 
            this.Controls.Add(priority);
    
            this.Controls.Add(new LiteralText());
    
            // Render no more than 3 tasks, but provide link to others.
            if (itemCount++ >= 3)
            {
                Link moreItemLink = new Link
                {
                    Text = "All my tasks",
                    href = SPMobileUtility.GetViewUrl(taskList, taskList.Views["My Tasks"])
                };
                this.Controls.Add(moreItemLink);
                break;
            } // end "if limit has been reached"
    
        } // end "for each lightweight task of the current user"
    } // end CreateControlsForDetailView
    
    Protected Overrides Sub CreateControlsForDetailView()
        Dim iconImage As Image = Me.CreateWebPartIcon(WebPartIconLink.LinkToSummaryView)
        iconImage.BreakAfter = False
        Me.Controls.Add(iconImage)
    
        Dim titleLabel As Label = Me.CreateWebPartLabel()
        Me.Controls.Add(titleLabel)
    
        Dim siteCollection As SPSite = SPContext.Current.Site
        Dim currentUser As SPUser = SPContext.Current.Web.CurrentUser
        Dim taskList As SPList = siteCollection.AllWebs("MyGPSite").Lists("Tasks")
        Dim allTasks As SPListItemCollection = taskList.GetItems(taskList.DefaultView)
    
        ' Use LINQ to filter out other users ... 
        Dim lightweightTasksOfUser = From task As SPListItem In allTasks
                                     Where task("AssignedTo").ToString().EndsWith(currentUser.Name)
                                     Select New With {Key task.Title, Key .Priority = task("Priority")} '... and unneeded columns.
    
        Dim itemCount As Int16 = 1
        For Each lightweightTask In lightweightTasksOfUser
            Dim taskIcon As New Image() With {.ImageUrl = Me.ItemBulletIconUrl, .BreakAfter = False}
            Me.Controls.Add(taskIcon)
    
            Dim taskTitle As Label = New Label With {.Text = lightweightTask.Title, .BreakAfter = False}
            taskTitle.Font.Bold = BooleanOption.True
            Me.Controls.Add(taskTitle)
    
            Dim priority As New Label() With {.Text = " " & lightweightTask.Priority}
            priority.Font.Size = FontSize.Small
            Me.Controls.Add(priority)
    
            Me.Controls.Add(New LiteralText())
    
            ' Render no more than 3 tasks, but provide link to others.
    
            If itemCount >= 3 Then
                itemCount += 1
                Dim moreItemLink As Link = New Link With {.Text = "All my tasks", .href = SPMobileUtility.GetViewUrl(taskList, taskList.Views("My Tasks"))}
                Me.Controls.Add(moreItemLink)
                Exit For
            End If ' end "if limit has been reached"
            itemCount += 1
        Next  ' end "for each lightweight task of the current user"
    End Sub ' end CreateControlsForDetailView
    
  7. Si vous avez besoin d'une logique personnalisée pendant les événements Init, Load, PreRender ou Unload, substituez les méthodes OnLoadForMobile(EventArgs), OnInitForMobile(EventArgs), OnPreRenderForMobile(EventArgs) ou OnUnloadForMobile(EventArgs), respectivement.

  8. Si vous voulez que les utilisateurs mobiles soient redirigés vers une page de vue de résumé personnalisée ou une page de vue détaillée à la place des pages fournies par les pages par défaut intégrées, substituez les propriétés SummaryViewPageUrl ou DetailViewPageUrl.

  9. Pour modifier l'icône qui apparaît à côté du titre du composant WebPart, substituez une ou plusieurs des propriétés suivantes :

    • SummaryViewTitleIconUrl – L'icône qui apparaît à côté du titre quand le composant WebPart est réduit.

    • DetailViewTitleIconUrl – L'icône qui apparaît en regard du titre quand le composant WebPart est développé.

    • TitleIconUrl– L'icône qui apparaît en regard du titre quand l'appareil mobile ne prend pas en charge les scripts de développement/réduction.

    Le code suivant illustre un exemple de la façon de substituer l'une de ces propriétés. Dans cette substitution de TitleIconUrl, si le composant WebPart affiche une liste et que la liste possède une icône qui lui est propre dans la propriété ImageUrl, cette icône sera affichée.

    protected override string TitleIconUrl
    {
        get
        { 
            SPContext context = SPContext.GetContext(HttpContext.Current);
    
            if (String.IsNullOrEmpty(context.List.ImageUrl))
            {
                return base.TitleIconUrl;
            }
            return context.List.ImageUrl;
        }
    }
    
    Protected Overrides ReadOnly Property TitleIconUrl() As String
        Get
            Dim context As SPContext = SPContext.GetContext(HttpContext.Current)
    
            If String.IsNullOrEmpty(context.List.ImageUrl) Then
                Return MyBase.TitleIconUrl
            End If
            Return context.List.ImageUrl
        End Get
    End Property
    
  10. Compilez l’assembly, affectez-lui un nom fort et déployez-le dans Global Assembly Cache (GAC), ou dans le dossier \BIN de l’application Web, sur chaque serveur Web frontal dans la batterie. Nous recommandons d’effectuer cette opération en déployant l’adaptateur avec une solution SharePoint Foundation. Par souci de simplicité, cette rubrique suppose que vous déployez vers le GAC. Pour plus d’informations sur le choix, voir Étape 2 : Placer l’assembly dans le répertoire Bin ou dans le Global Assembly Cache (éventuellement en anglais). Pour copier l’assembly uniquement vers le GAC de votre ordinateur de développement, utilisez l’utilitaire gacutil.exe. Pour vous assurer que chaque nouvelle version de votre adaptateur est installée dans le GAC, le plus simple est d’exécuter l’utilitaire à partir d’un fichier batch qui est lancé avec un événement après génération (Post-build) dans Visual Studio. Le fichier batch doit contenir la ligne suivante, où AssemblyName est remplacé par le nom de votre assembly.

    Notes

    Ce code suppose que vous avez suivi les recommandations fournies dans Procédure : ajouter des emplacements d’outils à la variable d’environnement PATH.

    gacutil –if bin\debug\AssemblyName.dll
    

Modifier le fichier compat.browser

  1. Ouvrez le fichier \\Inetpub\wwwroot\wss\VirtualDirectories\port_number\App_Browsers\compat.browser, où port_number est le port de l’application Web, dans un éditeur de texte et accédez à l’élément <browser> ayant la valeur d’attribut « default ». Il aura un élément enfant <controlAdapters> qui ressemble au contenu de l’exemple suivant :

    <controlAdapters>
      <adapter controlType="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.XsltListViewWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <adapter controlType="Microsoft.SharePoint.WebPartPages.ListViewWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.ListViewWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <adapter controlType="Microsoft.SharePoint.Applications.GroupBoard.WebPartPages.WhereaboutsWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.WhereaboutsWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <adapter controlType="Microsoft.SharePoint.WebPartPages.ImageWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.ImageWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
    </controlAdapters>
    
  2. Ajoutez un élément <adapter> en tant qu’enfant de l’élément <controlAdapters> pour mapper votre classe adaptateur au composant WebPart qu’il adapte suivant le schéma de l’exemple ci-dessus. Notez que les attributs controlType et adapterType sont nécessaires. Les deux correspondent au nom complet de la classe et au nom en quatre parties de l’assembly. Pour obtenir le jeton de clé publique de l’assembly de votre adaptateur, utilisez l’élément Obtenir la clé publique de l’assembly figurant dans le menu Outils de Visual Studio. (Si l’élément ne s’y trouve pas, voir Procédure : créer un outil pour obtenir la clé publique d'un assembly.) Pour plus d’informations sur les balises XML, voir Schéma du fichier de définition de navigateur (élément browsers) (éventuellement en anglais).

    Les exemples suivants illustrent de nouveaux éléments <adapter>. Le premier est pour un contrôle Contoso qui adapte UserTasksWebPart livré avec SharePoint Foundation. Le deuxième est pour un composant WebPart Northwinds qui adapte un composant WebPart Northwinds dans la même solution Northwinds.

      <adapter controlType="Microsoft.SharePoint.WebPartPages.UserTasksWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c "
        adapterType="Contoso.SharePoint.WebPartPages.UserTasksWebPartMobileAdapter, Contoso, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eedb3d3ba3b4c675" />
    
      <adapter controlType="NorthWinds.SharePoint.WebPartPages.VotingWebPart, Northwinds, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffec2e2af2b4c675"
        adapterType="NorthWinds.SharePoint.WebPartPages.VotingWebPartMobileAdapter, NorthWinds, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffec2e2af2b4c675" />
    

    Notes

    Pour déployer votre classe d’adaptateur vers une batterie de serveurs, vous devez modifier le fichier compat.browser comme décrit ci-dessus sur chaque serveur Web frontal. Vous ne devez pas remplacer le compat.browser existant par un fichier compat.browser propre à vous ou annuler les mappages de l’adaptateur qui sont effectués par d’autres fournisseurs de solutions SharePoint Foundation. Pensez à déployer l’adaptateur en tant que Composant fonctionnel SharePoint Foundation. Dans le gestionnaire d’événements FeatureActivated(SPFeatureReceiverProperties), ajoutez du code pour créer une tâche de minuterie (SPJobDefinition) qui ajoute l’élément <adapter> nécessaire au fichier compat.browser sur chaque serveur Web frontal. Pour plus d’informations sur la façon de modifier par programme le fichier compat.brower sur tous les serveurs en utilisant un travail du minuteur, voir Procédure : exécuter le code sur tous les serveurs Web.

Inscrire votre adaptateur en tant que contrôle sécurisé

  1. Vous devez inscrire votre adaptateur en tant que contrôle sécurisé.

    ConseilConseil

    Nous vous recommandons d'inscrire votre adaptateur en déployant l'adaptateur avec une solution SharePoint Foundation. Les étapes de cette section sont nécessaires uniquement si votre ordinateur de déploiement est un serveur Web frontal unique. L'utilisation de la solution SharePoint Foundation vous permet d'inscrire des contrôles comme sécurisés sur tous les serveurs Web frontaux automatiquement quand votre solution est déployée. Pour plus d'informations sur l'utilisation du déploiement de solutions pour inscrire des contrôles sécurisés, consultez Vue d'ensemble des solutions, Création manuelle d’une solution et Schéma de solution.

  2. Dans votre projet Visual Studio, ajoutez un fichier XML portant un nom de format webconfig.*.xml, où vous remplacez le * par le nom de votre entreprise ou un autre nom qui a peu de chances d'être utilisé par d'autres fournisseurs de solutions SharePoint Foundation.

  3. Ajoutez un élément <action> au fichier, similaire à celui représenté dans le balisage ci-après. L’attribut TypeName de l’élément <SafeControl> peut être le nom de votre classe d’adaptateur, comme UserTasksWebPartMobileAdapter. Si vous avez plusieurs classes d’adaptateurs, vous pouvez utiliser "*" comme valeur de TypeName. Ci-après un exemple.

    <action>
      <remove path="configuration/SharePoint/SafeControls/SafeControl[@Assembly=MyCompany.SharePoint.WebPartPages.MobileAdapters3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=yourAssemblyPublicKeyToken']" />
    
      <add path="configuration/SharePoint/SafeControls">
        <SafeControl
          Assembly="MyCompany.SharePoint.WebPartPages.MobileAdapters3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=yourAssemblyPublicKeyToken"
          Namespace="MyCompany.SharePoint.WebPartPages.MobileAdapters3"
          TypeName="*"
          Safe="True"
          AllowRemoteDesigner="True"
        />
      </add>
    </action>
    
    Note AttentionAttention

    L'utilisation de "*" comme valeur de TypeName transforme chaque espace de noms en contrôle sécurisé. Si vous avez des classes dans l'assembly qui ne doivent pas être désignées comme étant sécurisées, déplacez-les dans un autre assembly ou évitez d'utiliser "*".

    Pour plus d'informations sur l'élément <SafeControl> et les fichiers webconfig.*.xml, consultez Comment : créer un fichier .config supplémentaire et Utiliser des fichiers Web.config.

  4. Enregistrez le fichier. Il doit à présent être copié dans le dossier %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG sur votre ordinateur de développement. Pour effectuer cette opération sur votre ordinateur de développement, le plus simple est d'ajouter les quelques lignes suivantes à une ligne de commande d'événements après génération (Post-build) ou à un fichier batch qui est exécuté dans une ligne de commande d'événements après génération (Post-build).

    Notes

    Ce code suppose que vous avez suivi les recommandations fournies dans Procédure : ajouter des emplacements d’outils à la variable d’environnement PATH.

    xcopy /y webconfig.MyCompany.xml "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\CONFIG"
    stsadm –o copyappbincontent
    
  5. La commande stsadmn.execopyappbincontent exécute l’"<action>" définie dans votre webconfig.*.xml. En ce cas, elle insère le nouvel élément <SafeControl> de votre adaptateur dans le fichier web.config à la racine de votre application Web. (Elle supprime d’abord les éléments <SafeControl> existants de l’adaptateur. Cela vous permet de réexécuter l’opération stsadm avec chaque build sans dupliquer l’élément <SafeControl>.) Pour plus d’informations sur copyappbincontent et stsadm.exe, voir Stsadm, outil de ligne de commande (Windows SharePoint Services) et Copyappbincontent : opération Stsadm (Office SharePoint Server).