Using advanced C# features in Sharepoint development


Published on

1 Like
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Using advanced C# features in Sharepoint development

  1. 1. Alexey Sadomov, PhD, Sharepoint MVP
  2. 2.  Efficient way to troubleshoot issues, which are not reproduced on dev environment Page is opened in context of living site, e.g. Do not require updates of wsp packages Do not require installations of dlls into the GAC Can be easily removed from production after troubleshooting without leaving security holes C# 2.0 is available by default for server scripts
  3. 3.  Example: trace info about thread principal and currently logged Sharepoint user
  4. 4.  Example: trace info about thread principal and currently logged Sharepoint user
  5. 5.  Enable features of C# 3.0 in _layouts pages via web.config: All features of C# 3.0 become available (e.g. lambdas, query expressions, etc.): see Overview of C# 3.0
  6. 6.  Sharepoint 2013 preview:  Web sites are created with .Net 4.0 app pools  Default compiler is set to version 4.0  It is possible to use features of C# 4 (e.g. dynamic types) in embedded server scripts without additional configurations
  7. 7.  Use when can’t solve problem with standard tools Requires preliminary investigation of Sharepoint code:  JetBrains dotPeek  Telerik JustCompile  Reflector Where to search Sharepoint dlls:  GAC  14/ISAPI  inetpub...mywebapp_app_bin
  8. 8.  Real life example:  Create instance of SPSite in SPSecurity.RunWithElevatedPrivileges() method  Open SPWeb  Code is executed under SHAREPOINTSystem account (app pool identity)  Call standard API which in turns uses SPContext.Current.Site or SPContext.Current.Web  Result: access denied page
  9. 9.  Analyzing code of SPContext:
  10. 10.  Analyzing code of SPContext:
  11. 11.  Use knowledge of Sharepoint code and reflection for solving the problem:
  12. 12.  ReflectionHelper code:
  13. 13.  Can be used for generating and executing a method at run time, without having to generate a dynamic assembly and a dynamic type to contain the method The executable code created by the just-in-time (JIT) compiler is reclaimed when the DynamicMethod object is reclaimed If the dynamic method is associated with specific type, it has access to all members of the type, regardless of access level Dynamic methods and their parameters do not have to be named Allows to avoid some limitations of C#: e.g. although dynamic methods are static methods the relaxed rules for delegate binding allow a dynamic method to be bound to an object, so that it acts like an instance method when called using that delegate instance
  14. 14.  Example: dynamic method for calculating factorial
  15. 15.  How it can be used in Sharepoint? Example: use Telerik RadEditor in all sub sites in web application without feature activations  RadEditorFeature – overrides rendering template for RichTextField with Telerik control  RadEditorFeatureIE – “flag” feature, depends on RadEditorFeature Technically it is enough to activate RadEditorFeature once For new sites:  Activate features manually  Use feature stappling for OTB site definitions  Modify onet.xml file for custom site definitions
  16. 16.  Where problem is coming from? RadHtmlListField class:
  17. 17.  Solution:  Define new class inheritor of RadHtmlListField  Define OnLoad() by the same way as in RadHtmlListField using reflection  Always return true from ShowEditorOnPage() method Inheritance chain:  AllBrowsersHtmlListField –> RadHtmlListField –> MOSSRadEditor The problem: how to call MOSSRadEditor.OnLoad() from AllBrowsersHtmlListField.OnLoad() without caling RadHtmlListField .OnLoad()?  I.e. we need to skip one tier in the inheritance chain and call virtual method OnLoad(), but not from base class, but from base of base class Answer: no how in standard C# Can dynamic method help here? Yes
  18. 18.  Example: create dynamic method for skipping one tier in virtual members calls
  19. 19.  Camlex – open source project which simplifies creating of CAML queries for SharePoint by using expression trees Uses expression trees and lambda expressions for generating CAML Simplifies creation of dynamic CAML queries when conditions are calculated in runtime Doesn’t require knowledge of CAML from developers Supports native .Net types and Sharepoint-specific types
  20. 20.  Example of usage: Direct translator:
  21. 21.  Camlex 3.0 Reverse Engineering – creates expression trees based on strings Reverse Engineering translator:
  22. 22.  Camlex Re + ExpressionToCode = Camlex Online: Simplifies usage of Camlex for developers who didn’t have experience with it yet Quick refactoring of existing hard-coded CAML queries to Camlex Fully reversible CAML query schema opens many interesting applications in future Example of combining of several non-trivial OSS projects
  23. 23.  Add conditions to existing string queries using lambda expressions:
  24. 24.  Expand ViewFields, GroupBy, OrderBy:
  25. 25.  Built-in to OS, doesn’t need VS for writing and running C# programs May be useful:  if you already have a code which want to reuse  have existing C# code which is hard to move to PowerShell  for developers who know C#, but only started work with PowerShell  if you want to run quick test, but don’t want to run VS and compile dll C# 3.0 can be used: -Language CSharpVersion3 Can specify existing assemblies or source code files
  26. 26.  Example: enumerate sub-sites using C# code in PowerShell
  27. 27.  Use C# 3.0 features in application layout pages in Sharepoint: application-layout.html Use Telerik Rad Editor Lite without features activation: without.html Generating Dynamic Methods with Expression Trees in Visual Studio 2010: dynamic-methods-with-expression-trees-in-visual-studio-2010.aspx Camlex project site: Camlex online: ExpressionToCode: Materials from followings sites are used for presentation:,,,,