我正在用NCrawler做一些测试并得到了这个奇怪的异常:
' NCrawler.NCrawlerModule'的类型初始值设定项抛出一个例外。 内部异常是:找不到方法:' Void Autofac.RegistrationExtensions.RegisterModule(Autofac.ContainerBuilder, Autofac.Core.IModule)&#39 ;.
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>
有人可以帮忙吗?
答案 0 :(得分:1)
TypeInitializationException
表示失败的静态构造函数。在这种情况下,NCrawlerModule
上的静态构造函数失败。这是开始寻找的地方。
整个NCrawler项目看起来很混乱。
NCrawlerModule
](https://ncrawler.codeplex.com/SourceControl/latest#Net 4.0 / NCrawler / NCrawlerModule.cs)的CodePlex版本。原始代码[绑定到Autofac 2.4.5](https://ncrawler.codeplex.com/SourceControl/latest#Net 4.0 / NCrawler / NCrawler.csproj)master
分支NCrawlerModule
不存在,或者至少我找不到它。所有这一切的要点是你可能需要在你正在使用的NCrawler程序集上用dotPeek或你最喜欢的反编译器进行一些探索,看看你有什么那里。从问题或所有副本和不一致的地方来看,这一点并不明显。
无论如何,看看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的某些版本,与该版本的NCrawler不兼容。
如果NuGet包正确指定了它使用的版本,你可能已经避免了这个问题,但是,再次看起来似乎与该项目存在一些混淆。
而且,再一次,您可以通过查看NCrawler程序集的反编译版本并检查它引用的内容来验证所有这些。我猜它是Autofac的旧版本。
您有两种方法可以解决问题。
此外,希望您现在知道在将来看到这些异常时要从什么开始看:从静态构造函数开始,不要害怕在第三方源中开始使用。