代码之家  ›  专栏  ›  技术社区  ›  Matt

如何引用API的两个版本?

  •  7
  • Matt  · 技术社区  · 17 年前

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

    有更好的办法吗?

    谢谢

    2 回复  |  直到 17 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

    这就是我如何写出针对WSSv2 API编译的.NET 1.1版本和针对WSSv3程序集编译的.NET 2.0版本。它将适用于VS2005和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忍者动作,以保持一步构建过程并保持清醒 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>
    
        2
  •  2
  •   Marc Gravell    17 年前

    这是VB后期绑定(option strict off)方法运行良好的时候之一。在C#4.0和 dynamic

    NotSupportedException 对于无法执行的位),并在运行时加载相应的dll?(工厂法)