k668 发表于 2015-9-25 08:56:41

让 SharePoint 支持 .NET 3.5

  SharePoint 2007 是基于 .NET 2.0 开发,那 SharePoint 2007 支持 .NET 3.5 嘛? 答案是肯定的!任何 .NET 2.0 开发的程序包括都可以运行在 .NET 3.5 之上,可以充分利用 .NET 3.5 的新特性,包括 C# 3.5 的 LINQ,ASP.NET AJAX 等。
  好吧,你说支持,那么我们就写一段 C#3.5 的代码吧:

  1. 建一个 Document Library: BasicPages,Template 选择 Basic Page
  2. 在 BasicPages 中New一新页面:NET35Test.aspx
  3. 在 SharePoint Designer 打开
  4. 贴入文末的代码

  5. 按 F12 预览

  6. 得到如下错误
  Compiler Error Message: CS1526: A new expression requires () or [] after type

  注意:如果你得到的是 Parser Error Message: Code blocks are not allowed in this file.,你可以先参考:
ERROR: Code blocks are not allowed in this file(此文件中不允许代码块) - SharePoint 2007

  到底支不支持啊?稍安勿躁,让我们往 web.config 添加如下配置节:


<configuration>
<system.codedom>
      <compilers>
            <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
                <providerOption name="CompilerVersion" value="v3.5"/>
                <providerOption name="WarnAsError" value="false"/>
            </compiler>
      </compilers>
    </system.codedom>
</configuration>

  
  重新刷新,得到如下错误,
  Compiler Error Message: CS0234: The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)

  Line 5: <%@ Import Namespace="System.Linq" %>

  LINQ 来了,看来有戏,继续往 web.config 添加如下配置节:onfiguration>
<system.web>
<compilation batch="false" debug="false">
      <assemblies>
      <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
</compilation>
</system.web>
</configuration>

<configuration>
<system.web>
<compilation batch="false" debug="false">
      <assemblies>
      <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
</compilation>
</system.web>
</configuration>  
  重新刷新,啊哈结果出来:



  测试页面代码:

Code
<%-- _lcid="1033" _version="12.0.4518" _dal="1" --%>
<%-- _LocalBinding --%>
<%@ Page language="C#" MasterPageFile="~masterurl/default.master"    Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,Microsoft.SharePoint,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" meta:webpartpageexpansion="full" meta:progid="SharePoint.WebPartPage.Document" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Linq" %>

<script type="text/c#" runat="server">

    /// <summary>
    /// 示例改编自MSDN:
    /// 如何:查询对象集合(C# 编程指南)
    /// http://msdn.microsoft.com/zh-cn/library/bb907066.aspx
    /// </summary>
    public class StudentClass
    {
      #region data

      protected enum GradeLevel { FirstYear = 1, SecondYear, ThirdYear, FourthYear };

      protected class Student
      {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int ID { get; set; }
            public GradeLevel Year;
            public List<int> ExamScores;
      }

      protected static List<Student> students = new List<Student>
      {
            new Student {FirstName = "Terry", LastName = "Adams", ID = 120, Year = GradeLevel.SecondYear, ExamScores = new List<int>{ 99, 82, 81, 79}},
            new Student {FirstName = "Fadi", LastName = "Fakhouri", ID = 116, Year = GradeLevel.ThirdYear,ExamScores = new List<int>{ 99, 86, 90, 94}},
            new Student {FirstName = "Hanying", LastName = "Feng", ID = 117, Year = GradeLevel.FirstYear, ExamScores = new List<int>{ 93, 92, 80, 87}},
            new Student {FirstName = "Cesar", LastName = "Garcia", ID = 114, Year = GradeLevel.FourthYear,ExamScores = new List<int>{ 97, 89, 85, 82}},
            new Student {FirstName = "Debra", LastName = "Garcia", ID = 115, Year = GradeLevel.ThirdYear, ExamScores = new List<int>{ 35, 72, 91, 70}},
            new Student {FirstName = "Hugo", LastName = "Garcia", ID = 118, Year = GradeLevel.SecondYear, ExamScores = new List<int>{ 92, 90, 83, 78}},
            new Student {FirstName = "Sven", LastName = "Mortensen", ID = 113, Year = GradeLevel.FirstYear, ExamScores = new List<int>{ 88, 94, 65, 91}},
            new Student {FirstName = "Claire", LastName = "O'Donnell", ID = 112, Year = GradeLevel.FourthYear, ExamScores = new List<int>{ 75, 84, 91, 39}},
            new Student {FirstName = "Svetlana", LastName = "Omelchenko", ID = 111, Year = GradeLevel.SecondYear, ExamScores = new List<int>{ 97, 92, 81, 60}},
            new Student {FirstName = "Lance", LastName = "Tucker", ID = 119, Year = GradeLevel.ThirdYear, ExamScores = new List<int>{ 68, 79, 88, 92}},
            new Student {FirstName = "Michael", LastName = "Tucker", ID = 122, Year = GradeLevel.FirstYear, ExamScores = new List<int>{ 94, 92, 91, 91}},
            new Student {FirstName = "Eugene", LastName = "Zabokritski", ID = 121, Year = GradeLevel.FourthYear, ExamScores = new List<int>{ 96, 85, 91, 60}}
      };

      #endregion

      //Helper method
      protected static int GetPercentile(Student s)
      {
            double avg = s.ExamScores.Average();
            return avg > 0 ? (int)avg / 10 : 0;
      }

      public string QueryHighScores(int exam, int score)
      {
            StringBuilder sb = new StringBuilder();
            sb.Append("<pre style='font-size: 21px;'>");
            sb.Append("Hello MOSS 2007. You're running on .NET 3.5.\n\nPopulate students via LINQ:\n");
            var highScores = from student in students
                           where student.ExamScores > score
                           select new { Name = student.FirstName, Score = student.ExamScores };
            sb.AppendFormat("{0,-15}{1}\n", "Name", "Score");
            foreach (var item in highScores)
            {
                sb.AppendFormat("{0,-15}{1}\n", item.Name, item.Score);
            }
            sb.Append("</pre>");
            return sb.ToString();
      }
    }
</script>

<asp:Content ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
    <SharePoint:EncodedLiteral runat="server" text="<%$Resources:wss,webpagecreation_bp_title%>" EncodeMethod='HtmlEncode'/>
</asp:Content>
<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
      <% = new StudentClass().QueryHighScores(1, 90) %><WebPartPages:WebPartZone runat="server" ID="__WebPartPageLibraryZone__"><ZoneTemplate>
<WebPartPages:ContentEditorWebPart runat="server" __MarkupType="xmlmarkup" WebPart="true" __WebPartId="{658D1BBF-E074-44F3-98EC-A8363F60F4AD}" >
<WebPart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">
<Title>Content</Title>
<FrameType>None</FrameType>
<Description>Use for formatted text, tables, and images.</Description>
<IsIncluded>false</IsIncluded>
<PartOrder>1</PartOrder>
<FrameState>Normal</FrameState>
<Height />
<Width />
<AllowRemove>true</AllowRemove>
<AllowZoneChange>true</AllowZoneChange>
<AllowMinimize>false</AllowMinimize>
<AllowConnect>true</AllowConnect>
<AllowEdit>true</AllowEdit>
<AllowHide>true</AllowHide>
<IsVisible>true</IsVisible>
<DetailLink />
<HelpLink />
<HelpMode>Modeless</HelpMode>
<Dir>Default</Dir>
<PartImageSmall />
<MissingAssembly>Cannot import this Web Part.</MissingAssembly>
<PartImageLarge />
<IsIncludedFilter />
<ExportControlledProperties>true</ExportControlledProperties>
<ConnectionID>00000000-0000-0000-0000-000000000000</ConnectionID>
<ID>g_658d1bbf_e074_44f3_98ec_a8363f60f4ad</ID>
<ContentLink xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor" />
          <Content xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor"><!]></Content>
<PartStorage xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor" />
</WebPart>
</WebPartPages:ContentEditorWebPart>
</ZoneTemplate></WebPartPages:WebPartZone></asp:Content>
  
  总结,全部工作都在 web.config 中完成,有两个地方需要配置:

  一是,配置 system.codedom/compilers/complier,指示编译器版本
  二是,配置 system.web/compilation/assemblies,添加额外的.NET3.5程序集引用

  以上两个配置节只需要从已存在的 ASP.NET 3.5 应用程序的 web.config 拷贝过去。
  对于 sharepoint 的 webconfig 包含很多其特有属性,直接编辑是一件让人敬畏的事,很容易出错,一不小心就翘辫子了。

  update 2009年1月15日 1:28:37
  
  明天再介绍一种“自动化”的方法以及支持ASP.NET AJAX 的测试。
  如何自动化升级 SharePoint 的 web.config 到 .NET 3.5 ? 这里充分利用在 Vistual Studio 2008 中切换 .NET 版本的时候自动化更新 web.config 的特性:

  1. 新建一个 WebApplication 或者 WebSite,Target Framework 选择 .NET framework 2.0
2. 拷贝欲升级的 SharePoint web.config 替换新建站点的 web.config
3. 打开项目属性,选择 Application 选项卡
4. 在 Application 选项卡中,Target Framework 选择 .NET framework 3.5
5. OK,VS 自动帮你更新 web.config 中 ASP.NET 3.5 相关配置节,包括 ASP.NET AJAX
6. 将升级的 web.config 覆盖旧的 SharePoint 站点下的 web.config (注意一定要养成习惯先备份,不能保证更新的web.config完全兼容)

  
  
  
  update 2009年2月5日11:22:39
  在 Windows SharePoint Services 3.0 版中安装 ASP.NET 2.0 AJAX Extensions 1.0
页: [1]
查看完整版本: 让 SharePoint 支持 .NET 3.5