Konrad Z.
Konrad Z.

Reputation: 1652

Installing Sharepoint App with CSOM

Does anyone know if it is possible to automatically install particular App on sharepoint site using CSOM? We have mechanism that creates new site on sharepoint, and what we need is to automate process of installing particular Sharepoint App on each newly created site with CSOM.

Could anyone provide sample of the code or some useful links?

Upvotes: 4

Views: 5445

Answers (1)

Vadim Gremyachev
Vadim Gremyachev

Reputation: 59358

SharePoint CSOM API Web class exposes the following methods:

How to deploy (upload & install) SharePoint App via CSOM

/// <summary>
/// Deploy SP App 
/// </summary>
/// <param name="context">Client context</param>
/// <param name="appFullPath">Full path to app file (.app)</param>
/// <returns></returns>
private static AppInstance DeployApp(ClientContext context, string appFullPath)
{
    using (var packageStream = System.IO.File.OpenRead(appFullPath))
    {
       var appInstance = context.Web.LoadAndInstallApp(packageStream);
       context.Load(appInstance);
       context.ExecuteQuery();
       return appInstance;
    }
 }

Usage

The following example demonstrates how to deploy SP App into SharePoint Online

using (var ctx = new ClientContext(url))
{              
      ctx.Credentials = new SharePointOnlineCredentials(userName, securePassword);
      var appInstance = DeployApp(ctx, @"C:\Packages\SPApp.app");
      if (appInstance != null && appInstance.Status == AppInstanceStatus.Initialized)
      {
          Console.WriteLine("App was installed.");
      }
 }

Update

the above solution is intended for installing apps into developer site.

The following solution demonstrates how to install app to non developer site

public class SPAppManager
{
    /// <summary>
    /// Deploy SP App 
    /// </summary>
    /// <param name="context">Client context</param>
    /// <param name="appFullPath">Full path to app file (.app)</param>
    /// <returns></returns>
    public static AppInstance Deploy(ClientContext context, string appFullPath)
    {
        EnsureDeveloperFeature(context);
        using (var packageStream = System.IO.File.OpenRead(appFullPath))
        {
            var appInstance = context.Web.LoadAndInstallApp(packageStream);
            context.Load(appInstance);
            context.ExecuteQuery();
            return appInstance;
        }
    }


    /// <summary>
    /// Ensure Developer Feature 
    /// </summary>
    /// <param name="ctx"></param>
    private static void EnsureDeveloperFeature(ClientContext ctx)
    {
        var result = ctx.LoadQuery(ctx.Site.Features.Where(f => f.DefinitionId == DeveloperFeatureId));
        ctx.ExecuteQuery();
        if (result.Any()) return;
        var feature = ctx.Site.Features.Add(DeveloperFeatureId,true, FeatureDefinitionScope.None);
        ctx.ExecuteQuery();
    }


    private static readonly Guid DeveloperFeatureId = new Guid("e374875e-06b6-11e0-b0fa-57f5dfd72085");
} 

Gist: SPAppManager.cs

Usage

 using (var ctx = GetContext(webUri,userName,password))
 {
     var appInstance = SPAppManager.Deploy(ctx, @"C:\Packages\SPApp.app");
     if (appInstance != null && appInstance.Status == AppInstanceStatus.Initialized)
     {
        Console.WriteLine("App was installed.");
     }
 }

Upvotes: 3

Related Questions