からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

SharePoint Online Management Shell がインストールする CSOM がイケてない件について

発端は Japan SharePoint Support Team Blog の記事です。

PowerShell で SharePoint CSOM を使用する際の Tips – Japan SharePoint Support Team Blog

SharePoint Online Management Shell をインストールすることで、CSOM のモジュールもインストールされます。

はい、確かに SharePoint Online Management Shell をインストールすると、CSOM が使えるようになります。ただし、SharePoint Online Management Shell が入れる CSOM はかなりイケてないので、個人的にはまったところを含めて紹介したいと思います。なお、以下はすべて 2018/03/29 時点の情報であり、今後変更される可能性があります。

モジュールが不完全

SharePoint Online Management Shell に含まれる CSOM の dll は以下の通りです。

  • Microsoft.Online.SharePoint.Client.Tenant.dll
  • Microsoft.SharePoint.Client.dll
  • Microsoft.SharePoint.Client.Runtime.dll

一方、CSOM の NuGet パッケージ (Microsoft.SharePointOnline.CSOM の .NET 4.5 版) に含まれる dll は以下の通りです。

  • Microsoft.Office.Client.Policy.dll
  • Microsoft.Office.Client.TranslationServices.dll
  • Microsoft.Office.SharePoint.Tools.dll
  • Microsoft.Online.SharePoint.Client.Tenant.dll
  • Microsoft.ProjectServer.Client.dll
  • Microsoft.SharePoint.Client.dll
  • Microsoft.SharePoint.Client.DocumentManagement.dll
  • Microsoft.SharePoint.Client.Publishing.dll
  • Microsoft.SharePoint.Client.Runtime.dll
  • Microsoft.SharePoint.Client.Runtime.Windows.dll
  • Microsoft.SharePoint.Client.Search.Applications.dll
  • Microsoft.SharePoint.Client.Search.dll
  • Microsoft.SharePoint.Client.Taxonomy.dll
  • Microsoft.SharePoint.Client.UserProfiles.dll
  • Microsoft.SharePoint.Client.WorkflowServices.dll

明らかに足りない。確かに Microsoft.SharePoint.Client.dll と Microsoft.SharePoint.Client.Runtime.dll がコア機能をすべて持っているので、だいたいのことは事足りてしまうのですが、検索やソーシャル、管理されたメタデータといった機能が入っていないので、突然困ることになります。

謎のバージョンを GAC に突っ込む

SharePoint Online Management Shell の CSOM のアセンブリ バージョンは 16.0.7414.1200 です。そして、NuGet の CSOM のバージョンは 16.1.7414.1200 です。これだけならまだ困らないのですが、SharePoint Online Management Shell はなんと 16.0.7414.1200 の dll を GAC に入れてしまいます。そうすると、NuGet の CSOM でしか存在しない dll を読み込んだときに、アセンブリ バージョンの不整合が起こり、予期しないエラーが発生します。具体的には Assembly.LoadWithPartialName で dll を読み込んだときなどに発生します。*1
前掲の記事でも以下のコメントがあるのは、こういう状況が発生することを認識しているためと思われます。

なお、SharePoint Online Management Shell と SharePoint Online Client Components SDK などを同時にインストールした場合エラーが発生する可能性があるため、いずれかのみのインストールとしてください。

ともあれ、不完全に GAC に突っ込む動作はかなりいけてないので、何らかの改善を望みたいところです。せめてアセンブリ バージョンを合わせてほしい…。

*1:Assembly.LoadWithPartialName は obsolete なので使うなって話なのですが。