どのようにSharePoint ServerとSharPoint Foundationのコードを互換するかを書くか?


一般的に、私達のコードはSharePoint Foundationの上で実行したいなら、SharePoint Foundationの環境で中開発が一番便利です。SharePoint Server上で実行する必要があるなら、SharePoint Serverの環境では中開発が一番便利です。私達のコードがシェアポイントServerとFoundationを同時に互換する必要があるなら、私達はシェアポイントServerで開発を行うべきです。コードはSharePoint Foundationプラットフォームで実行したいです。いくつかの問題を追加的に考慮しなければなりません。
        まず、現在のシェアポイントはServerバージョンかFoundationバージョンかを判断します。一番正確な判断方法はレジストリの中のSharePoint製品IDを確認して、この文章を参照してもいいですが、レジストリを調べるのは面倒です。簡単な方法はコードから直接に現在のSharePointのproduct idを獲得して、製品のIDリストから検索すればいいです。
bool IsSharePointServer(){
    // B2C0B444-3914-4ACB-A0B8-7CF50A8F7AA0 : SharePoint Server 2010 Standard Trial
    // 3FDFBCC8-B3E4-4482-91FA-122C6432805C : SharePoint Server 2010 Standard
    // 88BED06D-8C6B-4E62-AB01-546D6005FE97 : SharePoint Server 2010 Enterprise Trial
    // D5595F62-449B-4061-B0B2-0CBAD410BB51 : SharePoint Server 2010 Enterprise
    Guid[] serverGuids = { new Guid("B2C0B444-3914-4ACB-A0B8-7CF50A8F7AA0"), 
                       new Guid("3FDFBCC8-B3E4-4482-91FA-122C6432805C"), 
                       new Guid("88BED06D-8C6B-4E62-AB01-546D6005FE97"), 
                       new Guid("D5595F62-449B-4061-B0B2-0CBAD410BB51") };

    // If a Server ID cannot be detected we are running on Foundation.
    bool isServer =  SPFarm.Local.Products.Any(productGuid => serverGuids.Contains(productGuid));
    return isServer
}
        この方法の利点は非常に正確で、欠点は比較的に面倒で、SharePoint製品のIDを調べなければなりません。2010を支持しているだけでなく、2013をサポートしているなら、異なる製品IDを調べて、異なるコードを書きます。
        第二の判断は、現在のシェアポイントがServerバージョンかFoundationバージョンかを判断する方法は、Farm中のフィーチャー定義を検索することであり、一部のフィーチャーはServer中に存在し、Foundation中には存在しない。例えば、Publishing featureがあります。このフィーチャーが存在するかどうかを判断することで、ServerバージョンかFoundationバージョンかを判断することができます。この方法の利点は簡単であり、SharePoint 2010でも2013でも使用可能である。しかし、この後のバージョンは例えば2015年にFoundationにfeatureを加えるかどうかは保証されていませんので、保険のやり方はFoundationにないフィーチャーがいくつかあると判断されます。以下はコードです。
bool IsSharePointServer(){
    bool isServer = false;
    SPFeatureDefinitionCollection features = SPFarm.Local.FeatureDefinitions;
    if (features["Publishing"] != null && features["TemplateDiscovery"] != null)
    {
        isServer= true;
    }
    return isServer;
}
        第二に考慮しなければならない問題は、いくつかのプログラムセットはServerバージョンにしかないです。例えば、Metadataをサポートするプログラム集Microsoft.SharePoint.Taxonomyは、Foundationでは見つけられません。しかし、これはServer上開発にありますので、VSはこのプログラムセットを参照してもいいです。問題は、このように書かれたコードは、Foundationで実行しても、dllを見つけられないエラーが発生し、コードが使えなくなります。解決の方法は、コードを書く時、現在のシェアポイントがServerバージョンかFoundationバージョンかを判断する必要があります。Foundationバージョンであれば、このようなコードを実行しないでください。例を挙げてください。
void DoSomethingOnBothServerAndFoundation()
{
    if(IsSharePointServer())
    {
        //Server
        TaxonomyField taxField = ...; //TaxonomyField  Microsoft.SharePoint.Taxonomy.dll    ,         
    }
    else
    {
        //Foundation
        ...
    }
}
        このようなコードを作成してから、配置をコンパイルして、Serverで実行しても大丈夫ですが、Foundationで実行しても、dllが見つからないエラーがあります。  ExceptionType:'FileNotFoundException'  Exception Message:'Could not load file or assieble'Microsoft.Share Point.Taxonomy,Verssion=14.0.0.0,Culture=neutral,PublicKeyToken=71e 9 bce111 e 9429 c'tone of its dependeces.The fitem's。その理由は運行時にJITが一つの方法をコンパイルする時、この方法で引用されたすべての種類のプログラム集をロードするからです。だからJITはこの方法をコンパイルする時、コードの中で現在のSharePointがServerかFoundationかを判断するかどうかに関わらず、Microsoft.SharePoint.Taxonomyのプログラム集をロードしますので、Foundationでは失敗しました。解決策は異なるプラットフォームに対して異なる方法を書き、呼び出し方法の前に判断する。
void DoSomethingOnBothServerAndFoundation()
{
    if(IsSharePointServer())
    {
        Method_Server();
    }
    else
    {
        Method_Foundation();
    }
}

void Method_Server()
{
    //Server
    TaxonomyField taxField = ...; //TaxonomyField  Microsoft.SharePoint.Taxonomy.dll    ,       
    ... ...
}

void Method_Foundation()
{
    //Foundation
    ... ...
}

このようにすれば、方法「MethoduServer()」はFoundation環境では動作しません。JITはMicrosoft.Share Point.Taxonomy.dllをロードしようとしません。エラーもないです。ServerとFoundationで正常に運行できます。