C#でSharePointへのファイルのアップロード機能作成したがエラーになる。

Hiratani, Hidehito/平谷 秀仁 0 評価のポイント
2024-07-09T10:15:48.02+00:00

プログラムの処理にてSPOへのアップロード、SPOからのダウンロード時にエラーとなり処理が行われない。

ExecuteQuery()で以下エラーが発生。

「メソッドが見つかりません: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object, System.Object)'」

利用している、CSOM:Microsoft.SharePoint.OnlineCSOM16.1.24908

対象dll:Microsoft.SharePoint.Client.dll
Framework4.5.2 
CSOMについてはFramework4.5.2対応の記事があるが、実行されない。
アップロードではなく、SPO間のファイル移動や、ファイルの存在チェックは可能。
[教えて欲しいこと]

一部記事には、エラーとなっているSystem.String System.String.Formatメソッド自体はFramework4.6の対応しかない記述もあるが実態としてどうなのか?
他、エラーの回避方法はあるか?

[以下、エラー詳細]

Com.Fujitsu.IOD.CommonLibrary.CO200L01.CO200L01(1256), メソッドが見つかりません: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object, System.Object)'

2024/06/28 19:40:34.609 [DEBUG], 1, Com.Fujitsu.IOD.CommonLibrary.CO200L01.CO200L01(1258),    場所 Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryMimeInfo.get_ContentType()   場所 Microsoft.SharePoint.Client.ClientRequest.SetupServerQuery(ChunkStringBuilder sb)   場所 Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer(ChunkStringBuilder sb)   場所 Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()   場所 Com.Fujitsu.IOD.CommonLibrary.CO200L01.CO200L01.uploadToSharepoint(String downloadFolderPathFS, String getFileTerms, String uploadFolderPathSPO)

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
71 件の質問
SharePoint
SharePoint
コンテンツ、知識、アプリケーションの共有と管理に使用される Microsoft 製品とテクノロジのグループ。
32 件の質問
0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. gekka 9,916 評価のポイント MVP
    2024-07-11T03:35:55.4133333+00:00

    .Net Framework 4.5.2までしか入れていない環境で実行するとそのエラーになるようです。
    .Net Framework 4.6以降をインストールしてください。

    # そもそもとして、4.5.2はすでにサポート期限切れなので

    //4.5.2にある
    public static string Format(IFormatProvider provider, string format, params object[] args);
    
    //4.6以降に追加
    public static string Format(IFormatProvider provider, string format, object arg0, object arg1);
    

    理屈としては4.6以降にある方の関数を呼び出すようにビルドされているため、4.5.2までしか入れてない環境だとMissingMethodExceptionが発生します。

    .Net Frameworkはバージョンごとにdllファイルがあるのではなく、同じdllファイルが上書きされていきます。
    このため、ターゲットを4.5.2にしてビルドしたアプリケーションであっても、4.6以降がインストールされている環境では4.6以降の関数は実装されているので、見つけて実行できてしまいます。

    ただし、このようなことは通常ありえないはずなのです。

    //元のソースコードが以下であるとすると
    public static string XX => string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} {1}", A0, A1);
    
    //4.5.2以前をターゲットにしてビルドした結果はこうなる
    public static string XX => string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} {1}", new object[2] { A0, A1 });
    
    //4.6以降をターゲットにしてビルドした結果はこうなる
    public static string XX => string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} {1}", A0, A1);
    

    問題発生のExecuteQueryMimeInfo.get_ContentTypeのあるアセンブリはMicrosoft.SharePoint.Client.Runtime.dllなのですが、これは.Net4.0用にビルドされてます。
    しかしstring.Fromatが4.6以降用の方にビルドされているようです。

    本来4.6以降でビルドされているアセンブリを4.6よりも前のバージョンをターゲットにしたアプリケーションで参照してもビルドができないはず。
    にもかかわらず4.6以降用であるという属性が付与されていないために、ビルドできてしまうが実行時にはエラーになる状態になってしまいます。

    # どのようにするとこのようにビルドできるか不明。
    # 4.6以降用にビルドした後にILdasmとLIasmを使ってTargetFrameworkAttributeを消して4.0用に偽装したら4.5.2でエラーを発生させられましたが、4.5.2までしか入れていない環境を用意するのも大変。

    つまり、問題となっているDLLは4.6以降が必要な状態にビルド済みなので、後から何かしようとすることはできません。
    フィードバックサイト にてカテゴリをSharePoint APIs(CSOM/REST/Server-side)あたりにして、フィードバックするぐらいしかできないでしょう。

    0 件のコメント コメントはありません

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。