在不同的计算机上运行应用程序时出现MissingMethodException

时间:2010-05-22 10:39:44

标签: app-config gac missingmethodexception assemblybinding system.xml

我遇到问题,我在Visual Studio 2010上编译我的应用程序,同时目标是.NET Framework 3.5,将其部署到客户端服务器,但却发现它给了我以下错误:

************** 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

它说它正在寻找的方法是:XslTransform.Transform Method (IXPathNavigable, XsltArgumentList, XmlWriter, XmlResolver)(支持于:4, 3.5 ,3.0,2.0,1.1)

我尝试使用assemblyBinding元素设置重定向到同一DLL的.NET Framework 4.0版本,如下所示:

<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>

但现在应用程序将无法运行,并将其放入事件日志中:

  

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。

总而言之,(1)有没有人知道为什么应用程序找不到列出的方法,(2)为什么它不能让我重定向到.NET 4.0版本的System.Xml?

感谢任何帮助,我完全陷入困境!

根据要求

app.config:

<?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>

3 个答案:

答案 0 :(得分:0)

如果您的目标是.NET 3.5,为什么要对System.Xml v4.0.0.0进行绑定重定向?确保您的项目引用该程序集的v2.0.0.0,并在app.config中包含以下内容:

<startup><supportedRuntime version="v2.0.50727"/></startup>

另外,请确保定位.NET Framework 3.5而不是.NET Framework 3.5 Client Profile。最后确保客户端安装了.NET 3.5。

答案 1 :(得分:0)

我已经使用这个Transform方法而不是之前的方法解决了这个问题(我之前将null传递给了最后的XmlResolver参数。

奇怪的是这对我的开发和测试机器有效,而不是服务器。

答案 2 :(得分:0)

尝试在程序集文件夹中查看System.XML.dll的文件版本。可能是你系统上文件的最后一位与服务器上的文件不同。在你的情况下“2.0.50727。 3082 ”似乎没有指定的方法签名。开发机器上的版本是“2.0.50727。 8009 ”,它具有所需的方法签名。

编辑:决定使用该方法的XMLReader版本。即使我们可以在我们的本地机器上注册GAC中的较新版本(它没有给出运行时错误)并且删除了错误。但由于.NET可以升级到更新的版本并覆盖GAC,我们需要注意新版本不会出现同样的问题。