MissingMethodException durante l'esecuzione di applicazioni su computer diversi
-
04-10-2019 - |
Domanda
Ho un problema in cui ho compilato la mia domanda su Visual Studio 2010, mentre rivolte a .NET Framework 3.5, schierato a un client server, solo per scoprire che mi dà il seguente errore:
************** 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
Il metodo si dice che sta cercando è questo: XslTransform.Transform Method (IXPathNavigable, XsltArgumentList, XmlWriter, XmlResolver)
(supportato in: 4, 3.5 , 3.0, 2.0, 1.1)
ho provato la creazione di un reindirizzamento al .NET Framework versione 4.0 della stessa DLL utilizzando il assemblyBinding
elemento in questo modo:
<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>
Ma ora l'applicazione non verrà eseguita, e pone questa nel registro eventi:
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.
Così, in sintesi, (1) Qualcuno sa perché l'applicazione non riesce a trovare il metodo elencato, e (2) il motivo per cui non Fammi reindirizzamento alla versione di .NET 4.0 su System.Xml?
Ogni aiuto è apprezzato, io sono totalmente bloccato!
app.config come richiesto:
<?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>
Soluzione 2
Ho risolto il problema utilizzando questo Transform
metodo al posto di quello precedente (dove ero in precedenza passando null
nell'argomento XmlResolver
alla fine).
Strano come questo ha lavorato sulla mia macchina di sviluppo e test, e non il server.
Altri suggerimenti
Se si prendono di mira .NET 3.5 perché stai facendo un redirect vincolante per System.Xml v4.0.0.0? Assicurarsi che il riferimento di progetto v2.0.0.0 dello stesso complesso che si dispone quanto segue nel app.config:
<startup><supportedRuntime version="v2.0.50727"/></startup>
Assicurarsi inoltre che si prendono di mira .NET Framework 3.5
e non .NET Framework 3.5 Client Profile
. Infine assicurarsi che il cliente ha installato .NET 3.5.
Prova a guardare nella versione del file per System.Xml.dll nella cartella di montaggio. è probabile che l'ultimo bit del file sul sistema sono diverse poi quelle sul server. nel tuo caso "2.0.50727. 3082 " non sembra avere la firma del metodo specificato. La versione sulla macchina di sviluppo è stato "2.0.50727. 8009 ", che ha avuto la firma del metodo richiesto.
EDIT: ha deciso di utilizzare la versione XMLReader del metodo. Anche se abbiamo potuto registrare la versione più recente del GAC (che did'nt dare errore di runtime) dal nostro macchina locale e che ha rimosso l'errore. ma dal momento che il .NET potrebbe effettuare l'aggiornamento a una nuova versione e GAC sovrascrittura ci sarebbe bisogno di stare attenti che la versione più recente non avrebbe avuto lo stesso problema.