どのようにSharePoint ServerとSharPoint Foundationのコードを互換するかを書くか?
4033 ワード
一般的に、私達のコードはSharePoint Foundationの上で実行したいなら、SharePoint Foundationの環境で中開発が一番便利です。SharePoint Server上で実行する必要があるなら、SharePoint Serverの環境では中開発が一番便利です。私達のコードがシェアポイントServerとFoundationを同時に互換する必要があるなら、私達はシェアポイントServerで開発を行うべきです。コードはSharePoint Foundationプラットフォームで実行したいです。いくつかの問題を追加的に考慮しなければなりません。
まず、現在のシェアポイントはServerバージョンかFoundationバージョンかを判断します。一番正確な判断方法はレジストリの中のSharePoint製品IDを確認して、この文章を参照してもいいですが、レジストリを調べるのは面倒です。簡単な方法はコードから直接に現在のSharePointのproduct idを獲得して、製品のIDリストから検索すればいいです。
第二の判断は、現在のシェアポイントがServerバージョンかFoundationバージョンかを判断する方法は、Farm中のフィーチャー定義を検索することであり、一部のフィーチャーはServer中に存在し、Foundation中には存在しない。例えば、Publishing featureがあります。このフィーチャーが存在するかどうかを判断することで、ServerバージョンかFoundationバージョンかを判断することができます。この方法の利点は簡単であり、SharePoint 2010でも2013でも使用可能である。しかし、この後のバージョンは例えば2015年にFoundationにfeatureを加えるかどうかは保証されていませんので、保険のやり方は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で正常に運行できます。