我需要引用两个不同版本的Sharepoint API dll。我有一个需要在Sharepoint 2和Sharepoint 3下运行的web服务,但还需要使用Sharepoint 3 API提供的新功能(Checkout和内容审批)
实现这一目标的最佳方法是什么 - 我目前正倾向于有两个项目,两个项目之间的代码共享,使用条件编译编译代码的各个部分。
有更好的方法吗?
由于
马特
答案 0 :(得分:3)
这就是我如何吐出针对WSSv2 API编译的.NET 1.1版本以及针对WSSv3程序集编译的.NET 2.0。它适用于VS 2005和2008。
您需要使用MSBEE http://www.codeplex.com/Wiki/View.aspx?ProjectName=MSBee
Working with .NET 1.1 with Visual Studio 2008
打开* .csproj并找出引用SharePoint dll的位置并更改为类似这样的内容,根据您的目标更改引用的程序集(FX1_1表示您的目标是.NET1.1,因此WSSv2)
<Reference Include="Microsoft.SharePoint">
<HintPath Condition="'$(TargetFX1_1)'!='true'">pathto\WSS3\Microsoft.SharePoint.dll</HintPath>
<HintPath Condition="'$(TargetFX1_1)'=='true'">pathto\WSS2\Microsoft.SharePoint.dll</HintPath>
</Reference>
在必要时使用条件编译来区分
#if FX1_1
// WSSv2 specific code
#else
// WSSv3 specific code
#endif
如果您遇到编译器错误但代码看起来正确,则可能是错误仅适用于.NET1.1 / WSSv2并且在.NET2 / WSSv3中编译良好。检查输出选项卡以查看发生错误的目标
你还需要掌握一些MSBUILD忍者动作,以保持一步构建过程,并使用MSBUILD保持自己的理智http://brennan.offwhite.net/blog/2006/11/30/7-steps-to-msbuild/,你可以让VS同时编译两个版本,而无需诉诸命令行。
这将在.NET完成后运行.NET1.1编译,并将一些消息输出到“输出”窗口,以帮助您找出发生错误的位置。
<Target Name="BeforeBuild">
<Message Text="--- Building for .NET 1.1 ---" Importance="high" Condition="'$(TargetFX1_1)'=='true'" />
<Message Text="--- Building for .NET 2.0 ---" Importance="high" Condition="'$(TargetFX1_1)'!='true'" />
</Target>
<Target Name="AfterBuild" Condition="'$(TargetFX1_1)'!='true'">
<MSBuild Projects="$(MSBuildProjectFile)" Properties="TargetFX1_1=true;" />
</Target>
答案 1 :(得分:2)
你可以给一个“外部别名”。
这是VB后期绑定(选项严格关闭)方法运行良好的时候之一。滚动C#4.0和dynamic
。
您可以尝试为您需要的位(在基础库中)编写接口,并编写2个dll:一个引用每个版本的sharepoint dll。对于这两个项目,实现接口(为你不能做的位抛出NotSupportedException
),并在运行时加载适当的dll? (工厂方法)
在你过于专注之前,只需用一种方法尝试一下......除非你知道它适用于最简单的方法,否则不要做整件事。