Nick Grattan's Blog

About Microsoft SharePoint, .NET, Natural Language Processing and Machine Learning

Archive for the ‘SharePoint Object Model’ Category

Extracting Public Key from Signed Assembly

with 4 comments

Once an assembly has been signed you can extract the public key token using the ‘sn’ .NET utility. This is necessary if you need to create a reference to an assembly, for example in the form:

<Field  Name=”FieldTypeClass”> RatingField.RatingField,RatingField, Version=,Culture=neutral, PublicKeyToken=ef9f3072afebf3b0 </Field>

To do this:

  1. Run a Visual Studio 2005 command prompt (Visual Studio Tool + Visual Studio 2005 Command Prompt from the “Start” menu).
  2. Enter the following command:

sn -Tp ratingfield.dll

Where “ratingfield.dll” is the name of the signed assembly.

Written by Nick Grattan

August 6, 2007 at 2:14 pm

Where have my versions gone?

leave a comment »

Once enabled for a library or list, major and minor versions of documents and items can be kept; the number of which can be specified in the library or list settings:


The version history for items or documents can be viewed, and old versions can be opened and inspected. But where are these old versions stored?

Version histories are maintained for files and for property (column) values. In the case of a document library both a file and a property history is maintained, but for a list item only a property history is kept. The SharePoint class libraries or web services can be used to programmatically access this information, and also determine the URL where a pervious version of a document is located.

So, on a SharePoint server create a new Visual Studio project and add a reference to the “Microsoft.SharePoint.dll” library. Then add a using statement to “Microsoft.SharePoint.” Assuming you have already a reference to a SPList object representing the list or library you can obain a reference to the collection of previous file versions:

            SPFileVersionCollection theFileVersions = lstItem.File.Versions;

The collection can be iterated, and in this case, the version label and URL are added to a WinForm data grid view control:

            foreach (SPFileVersion liVer in theFileVersions)


               int rowID = dgvVersions.Rows.Add();

               dgvVersions.Rows[rowID].Cells[0].Value = liVer.VersionLabel;

               dgvVersions.Rows[rowID].Cells[1].Value = liVer.Url;


The output will look like the following:


You can see from this that the previous versions are stored in a virtual folder called “_vti_history” under the site in which the library is located. The virtual folder “512” represents the version number (taking into account other versioned documents in the site). This URL together with the URL for the site can be used to directly open previous versions.

The SPFileVersion object can also be used to access the contents of the file. In this code, the bytes associated with the version are obtained and then saved to a file:

            byte[] outBytes = liVer.OpenBinary();

            using (BinaryWriter binWriter =

               new BinaryWriter(File.Open(@”C:\Temp\MyFile.xlsx”,





This works well with documents, but the situation is much more complex with pages, content and web parts. Navigating to the URL for pages will result in an HTTP 404 – “file not found”.

Written by Nick Grattan

July 31, 2007 at 3:46 pm

Finding the correct w3wp.exe when debugging

leave a comment »

When using the Visual Studio Debug +Processes menu command to attach to a web site to debug you may be presented with several w3wp.exe processes under II6 with Windows Server 2003. There is one for each application pool running under IIS. Here’s how to find out which one is running your application:

  1. Run a command prompt and navigate to the Windows system32 folder
  2. Issue the following command:

cscript iisapp.vbs

The output from this script will be something like:

Microsoft (R) Windows Script Host Version 5.6

Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


W3WP.exe PID: 4044   AppPoolId: MSSharePointPortalAppPool

The process id is 4044 for, in this case, SharePoint Portal Server.

Written by Nick Grattan

July 20, 2007 at 4:53 pm