3
votes

I (successfully) deployed some sharepoint2010 - Webparts using msbuild. Everything works fine until I decided to change the assemblyVersion. Whenever I do that the message

Web Part Error: A Web Part or Web Form Control on this Page cannot be displayed or imported. The type RTContacts, RTContacts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2721ba85ef1e4b88 could not be found or it is not registered as safe.

A solution would be to stay on 1.0.0.0, but there should be a better way...

Perhaps interesting to mention is that we use a centralized AssemblyFile which is included as a link.

The manifest contains the correct assemblyversion:

<Assemblies>
<Assembly Location="RTContacts.dll" DeploymentTarget="GlobalAssemblyCache">
  <SafeControls>
    <SafeControl Assembly="RTContacts, Version=1.0.4325.18399, Culture=neutral, PublicKeyToken=2721ba85ef1e4b88" Namespace="RTContacts" TypeName="*" />
  </SafeControls>
</Assembly>

When I add the WebPart again to that Site, it is displayed correctly, but already existing webParts seem to link to the old version.

2

2 Answers

5
votes

You are having these problems because you're using the versioning attributes incorrectly.

If you examine, for example, Microsoft.SharePoint.dll in Reflector you will see v14.0.0.0 (for SharePoint 2010).

This AssemblyVersion will stay exactly the same for Beta, RCx, RTM all service packs and CU's etc - the only thing that changes is the AssemblyFileVersion (this is the thing you see in Windows Explorer under properties)

See this for more details

SharePoint features: How can I use wildcard assembly versioning?

But don't take my word for it - Microsoft KB556041 - How to use Assembly Version and Assembly File Version

If you follow this then no Assembly binding redirections are necessary and when you update your web part the existing instances will not be broken.

2
votes

Original question: How to fix the "Not registered as safe" error after the assembly version has been changed?

Web Parts are registered as safe in the web.config files.

Appropriate entry looks like this:

<SafeControl Assembly="MyWebPartLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
  Namespace="MyWebPartLibrary"
  TypeName="*"
  Safe="True"
  AllowRemoteDesigner="True"/>

Modify the Assembly attribute and replace the old version number with a new one.

Current question: How can I change assembly version without having to re-add all the Web Parts to the page?

I think you'll need to use assembly redirection to keep existing Web Part instances working:

<runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity name="RTContacts" publicKeyToken="2721ba85ef1e4b88" culture="neutral" />
      <bindingRedirect oldVersion="1.0.0.0" newVersion="1.0.4325.18399" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Read the article Web Part Versioning with assembly redirection for a detailed analysis of this problem.