MissingMethodException lorsque l'application en cours d'exécution sur un autre ordinateur
-
04-10-2019 - |
Question
J'ai un problème où je compilé mon application sur Visual Studio 2010, alors que le ciblage .NET Framework 3.5, déployé sur un serveur client, seulement pour trouver il me donne l'erreur suivante:
************** Exception Text **************
System.MissingMethodException: Method not found: 'Void
System.Xml.Xsl.XslCompiledTransform.Transform(
System.Xml.XPath.IXPathNavigable,
System.Xml.Xsl.XsltArgumentList,
System.Xml.XmlWriter,
System.Xml.XmlResolver)'.
************** Loaded Assemblies **************
[...]
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.3082 (QFE.050727-3000)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
La méthode, il dit qu'il cherche est le suivant: XslTransform.Transform Method (IXPathNavigable, XsltArgumentList, XmlWriter, XmlResolver)
(pris en charge dans: 4, 3,5 , 3.0, 2.0, 1.1)
J'ai essayé la mise en place d'une redirection vers le .NET Framework version 4.0 de la même DLL en utilisant le assemblyBinding
élément comme ceci:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml"
publicKeyToken="b77a5c561934e089"
culture="neutral" />
<bindingRedirect oldVersion="2.0.0.0"
newVersion="4.0.0.0"/>
<codeBase version="4.0.0.0"
href="file:///C:/WINDOWS/Microsoft.NET/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Mais maintenant, l'application ne fonctionne pas, et met cela dans le journal des événements:
EventType clr20r3, P1 MyApplication.exe, P2 3.85.12.27583, P3 4be9757f, P4 System.Configuration, P5 2.0.0.0, P6 4889de74, P7 1A6, P8 136, P9 ioibmurhynrxkw0zxkyrvfn0boyyufow, P10 NIL.
Donc, en résumé, (1) personne ne sait pourquoi l'application ne peut pas trouver la méthode dans la liste, et (2) pourquoi ne pas me laisser rediriger vers la version .NET 4.0 System.Xml?
Toute aide est appréciée, je suis tout à fait bloqué!
app.config comme demandé:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="myapplication.Properties.UserSettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<system.net>
<mailSettings>
<smtp from="e-monitoring@myapplication.co.uk">
<network defaultCredentials="true" host="192.168.0.132" port="25" password="" userName="" />
</smtp>
</mailSettings>
</system.net>
<appSettings file="">
<add key="ReportDataCollectionTimeout" value="360" />
<add key="AllowedDatabaseBuild" value="3" />
<add key="AllowedDatabaseRevision" value="085" />
<add key="HelpNamespace" value="myapplicationHelpfile.chm" />
<add key="ProFormaHomePageUri" value="https://myapplication.co.uk/" />
<add key="ProFormaLoginPageUri" value="https://myapplication.co.uk/login.aspx" />
</appSettings>
<connectionStrings configSource="connectionStrings.config" />
<userSettings>
<myapplication.Properties.UserSettings>
<setting name="RequiresUpgrade" serializeAs="String">
<value>True</value>
</setting>
</myapplication.Properties.UserSettings>
</userSettings>
</configuration>
La solution 2
Autres conseils
Si vous ciblez .NET 3.5 pourquoi vous faites une redirection de liaison à System.XML v4.0.0.0? Assurez-vous que vos références de projet v2.0.0.0 de cette assemblée et que vous avez les éléments suivants dans votre app.config:
<startup><supportedRuntime version="v2.0.50727"/></startup>
Assurez-vous que vous ciblez également .NET Framework 3.5
et non .NET Framework 3.5 Client Profile
. Enfin assurez-vous que le client a installé .NET 3.5.
Essayez de regarder dans la version de fichier pour System.XML.dll dans le dossier de montage. les chances sont que le dernier bit du fichier sur votre système sont différents, ceux sur le serveur. dans votre cas "2.0.50727. 3082 " ne semble pas avoir la signature de la méthode spécifiée. La version sur la machine de développement était "2.0.50727. 8009 " qui a eu la signature de la méthode requise.
EDIT: Nous avons décidé d'utiliser la version XMLReader de la méthode. Même si nous pouvions enregistrer la nouvelle version dans le GAC (qui did'nt donner erreur d'exécution) de notre machine locale et qui a supprimé l'erreur. mais depuis le .NET pourrait passer à une version plus récente et GAC Ecraser nous devrions veiller à ce que la nouvelle version ne serait pas le même problème.