ASP.net 3.5 SP1 : Could not load type 'System.Web.UI.ScriptReferenceBase'
Après publication de votre site web vous obtenez l'erreur suivante :
"System.TypeLoadException: Could not load type 'System.Web.UI.ScriptReferenceBase' from assembly 'System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
Cette erreur provient du SP1 de .net 3.5. Vous avez installé le SP1 sur votre machine de dev/déploiement puis publier le site web à partir de cette machine afin de le déposer sur le serveur ne possédant pas le SP1.
Pour corriger cette erreur, il faut installer le SP1 du framework 3.5 sur le serveur : Download : Microsoft .NET Framework 3.5 Service Pack 1
Mais d'où provient cette erreur ?
Dans votre site web, vous vous servez du ScriptManager afin d'insérer vos propres fichiers JavaScript, vous avez donc quelque chose ressemblant à :
<asp:ScriptManager runat="server">
<Scripts>
<asp:ScriptReference Path="~/js/myfile.js" />
</Scripts>
</asp:ScriptManager>
Lors de la publication du site web, vous avez la possibilité de cocher la case "Allow this precompiled site to be updatable", si vous la décochez (ce que je vous conseille) la publication va compiler les .aspx vers une assembly. La ligne du ScriptReference du contrôle ci-dessus va alors être traduite en ce code :
[DebuggerNonUserCode]
private ScriptReference __BuildControl__control6()
{
ScriptReference reference2 = new ScriptReference();
reference2.set_Path("/WS/CSWS.asmx/js");
return reference2;
}
Le SP1 de .net 3.5, amène une nouvelle classe : CompositeScriptReference. Cette classe permet d'utiliser le "script combining" une nouvelle fonctionnalité du ScriptManager permettant de regrouper plusieurs fichiers JavaScript en un seul. Cette classe a donc des fonctionnalités très proches du ScriptReference il est donc logique que ces deux classes partagent un parent commun, le SP1 a donc rajouté la classe ScriptReferenceBase.
Si vous n'avez toujours pas vu le problème, regardons le code MSIL du code ci-dessus :
ldstr "/WS/CSWS.asmx/js"
callvirt instance void [System.Web.Extensions]System.Web.UI.ScriptReferenceBase::set_Path(string)
On comprend maintenant pourquoi si l'on publie un site web à partir d'une machine possédant le SP1 de .net 3.5, ce site web ne fonctionne plus sur une machine ne possédant pas le SP1.
Bug ou pas bug ?
Je n'arrive pas à me décider, je ne trouve pas normal que la mis en place du SP1 sur la machine de dev entraine ce genre de problèmes, mais je ne vois pas d'autres solutions.
Et vous qu'en pensez vous ? bug ou pas bug ?