【问题标题】:MissingMethodException when running application on different computer在不同的计算机上运行应用程序时出现 MissingMethodException
【发布时间】:2010-05-22 10:39:43
【问题描述】:

我有一个问题,我在 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>

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

事件类型 clr20r3, P1 我的应用程序.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 无。

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

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

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>

【问题讨论】:

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


    【解决方案1】:

    如果您的目标是 .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。

    【讨论】:

    • 我将重定向绑定到 .NET 4.0 程序集,因为我假设 VS2010 已经使用它以某种方式编译应用程序并期望 .NET 4.0 版本。这真的很有意义,因为这一切都发生了变化——在 VS2008 中编译时它运行良好。我给startup 元素试一试,看看它是否可以成功强制版本。
    • 是的,但是您正在重定向 v4.0.0.0 而不是 来自。此外,当您以 .NET 3.5 为目标时,VS2010 将自动修复核心程序集的引用。
    • 我在使用 startup 元素时收到以下错误: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.
    • "是的,但是您被重定向到 v4.0.0.0 而不是来自。"您可以从我粘贴在问题中的第一个错误中的Loaded Assemblies 列表中看到,它正在加载 v2。
    • 如果您在 VS1010 中从头开始创建一个新项目,以 .NET 3.5 框架为目标并尝试在远程计算机上运行它会发生什么?
    【解决方案2】:

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

    奇怪这在我的开发和测试机器上是如何工作的,而不是在服务器上。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 2016-11-17
        • 1970-01-01
        • 2012-01-29
        • 2011-01-19
        • 1970-01-01
        相关资源
        最近更新 更多