如何引用两个版本的API?

7
我需要引用两个不同版本的Sharepoint API dll。我有一个Web服务需要在Sharepoint 2和Sharepoint 3下运行,但也需要使用由Sharepoint 3 API提供的新功能(检出和内容审核)。
最好的方法是什么?我目前倾向于使用两个项目,将代码放在单个文件中,在条件编译中使用不同部分的代码进行编译。
还有更好的方法吗?
谢谢
马特
2个回答

3
这是我如何生成针对WSSv2 API编译的.NET 1.1版本和针对WSSv3程序集编译的.NET 2.0版本。这将适用于VS 2005和2008。
您需要使用MSBEE http://www.codeplex.com/Wiki/View.aspx?ProjectName=MSBee 在Visual Studio 2008中使用.NET 1.1

一些提示

打开 *.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,您可以让VS同时编译两个版本,而不必使用命令行。您可以参考http://brennan.offwhite.net/blog/2006/11/30/7-steps-to-msbuild/
这将在.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>

2
你可以尝试使用 "extern alias"。 这是VB后期绑定(选项strict off)方法适用的情况之一。期待C# 4.0和dynamic的到来。 你可以尝试为所需的部分编写一个接口(在基础库中),并编写2个dll:一个引用每个版本的sharepoint dll。对于两个项目,实现接口(对于无法处理的部分抛出NotSupportedException),并在运行时加载适当的dll?(工厂方法) 在深入之前,请先尝试使用单个方法进行测试...在了解最简单的方法是否有效之前不要做整个操作。

你能否详细说明一下后期绑定选项的工作原理?我正在尝试看看是否可以用于解决我的一个类似问题,但是@Ryan发布的答案行不通。 - Thijser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接