7

我需要引用两个不同版本的 Sharepoint API dll。我有一个需要在 Sharepoint 2 和 Sharepoint 3 下运行的 Web 服务,但还需要使用 Sharepoint 3 API 提供的新功能(结帐和内容批准)

实现这一目标的最佳方法是什么 - 我目前倾向于拥有两个项目,两个项目之间共享单个文件中的代码,并使用条件编译编译代码的各个部分。

有没有更好的办法 ?

谢谢

马特

4

2 回答 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 忍者动作,以保持 1 步构建过程并让自己保持清醒http://brennan.offwhite.net/blog/2006/11/30/7-steps-to-msbuild/使用 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>
于 2008-11-13T15:22:46.983 回答
2

您可以尝试使用“外部别名”。

这是 VB 后期绑定(选项严格关闭)方法运作良好的时期之一。在 C# 4.0 和dynamic.

您可以尝试为您需要的位(在基础库中)编写一个接口,并编写 2 个 dll:一个引用每个版本的 sharepoint dll。对于这两个项目,实现接口(抛出NotSupportedException你不能做的位),并在运行时加载适当的 dll?(工厂方法)

在你太专注之前用一种方法尝试它......在你知道它适用于最简单的简单方法之前不要做整个事情。

于 2008-11-13T12:53:18.860 回答