【问题标题】:TypeInitializationException using NCrawler; missing Autofac method使用 NCrawler 的 TypeInitializationException;缺少 Autofac 方法
【发布时间】:2016-07-14 09:34:27
【问题描述】:


我正在用 NCrawler 做一些测试,得到了这个奇怪的异常:

“NCrawler.NCrawlerModule”的类型初始化程序引发了异常。 内部异常是:找不到方法:'无效 Autofac.RegistrationExtensions.RegisterModule(Autofac.ContainerBuilder, Autofac.Core.IModule)'。

异常发生在 Crawlers 构造函数中。

这是我的代码:

 static void Main(string[] args)
    {
        using (Crawler c = new Crawler(new Uri("http://stackoverflow.com"), new HtmlDocumentProcessor(), new TestStep()))
        {
            c.MaximumThreadCount = 3;
            c.MaximumCrawlDepth = 2;
            c.ExcludeFilter = new[] { new RegexFilter(
            new Regex(@"(\.jpg|\.css|\.js|\.gif|\.jpeg|\.png|\.ico)",
            RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase)) };
            c.Crawl();
        }
    }

这是 TestStep 类:

public class TestStep : IPipelineStep
{
    public void Process(Crawler crawler, PropertyBag propertyBag)
    {
        Console.Out.WriteLineAsync(propertyBag.Step.Uri.ToString());
    }
}

我尝试使用 NuGet 卸载并重新安装 Autofac,但没有成功。 奇怪的是 packages.config 上的版本是 3.5.2 但在 app.config 上似乎试图将其绑定到 3.5.0
这是 packages.config 中的 AutoFac:

 <package id="Autofac" version="3.5.2" targetFramework="net452" />

在 app.config 中:

<dependentAssembly>
    <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
  </dependentAssembly>

有人可以帮忙吗?

【问题讨论】:

    标签: c# .net web-crawler console-application autofac


    【解决方案1】:

    TypeInitializationException 表示静态构造函数失败。在这种情况下,NCrawlerModule 上的静态构造函数失败。这就是开始寻找的地方。

    整个 NCrawler 项目看起来相当混乱。

    所有这一切的重点是,您可能需要对dotPeek 或您最喜欢的反编译器在您正在使用的 NCrawler 程序集上进行一些探索, 以查看其中的内容。从问题或所有副本和不一致之处来看,这一点并不明显。

    不管怎样,看看the static constructor on NCrawlerModule,你会发现它实际上是eventually trying to call a RegisterModule() extension method

    现在,looking at Autofac.RegistrationExtensions in Autofac 3.5.2,果然,没有RegisterModule 方法。在 3.5.2 中,该方法 is in a ModuleRegistrationExtensions class,这就是您看到异常的原因:NCrawler 正在寻找错误的位置。

    归结为您可能有一个针对 Autofac 2.4.5 编译的 NCrawler 版本,并且您正在尝试将 Autofac 3.x 与它一起使用。或者,至少,您有 NCrawler,并且您正在尝试使用与该版本不兼容的 Autofac某个版本

    如果 NuGet 包正确指定了它使用的版本,您可能可以避免该问题,但是,该项目似乎存在一些混淆。

    同样,您可以通过查看 NCrawler 程序集的反编译版本并检查它引用的内容来验证所有这些。我猜这是 Autofac 的一个相当老的版本。

    您有两种选择来解决问题。

    • 获取根据更新的 Autofac 编译的新版本 NCrawler。你可以说服那些项目维护者更新他们的包,或者你可以分叉并自己做。
    • 您可以确定您的 NCrawler 正在使用哪个旧版本的 Autofac,并将您的整个应用程序回滚到旧 Autofac。这对我来说听起来很痛苦,因为你会回到过去。就我个人而言,我更愿意尝试让事情向前发展。

    此外,希望现在您知道当您将来看到这些异常时该开始查看什么:从静态构造函数开始,不要害怕开始研究第三方源代码。

    【讨论】:

    • 非常感谢!我怀疑 Autofac 的版本是问题所在。我将尝试获取新版本的 NCrawler。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多