使用NHUnspell NuGet包时无法加载文件或程序集Hunspellx64.dll
本文关键字:程序集 Hunspellx64 dll 文件 加载 NHUnspell NuGet 包时无 使用 | 更新日期: 2023-09-27 18:28:20
我有一个ASP.NET/MVC Web角色正在使用NHUnspell NuGet包。当我尝试运行它时,我得到以下错误消息:
Could not load file or assembly 'Hunspellx64.dll' or one of its dependencies. The module was expected to contain an assembly manifest.
这很奇怪,因为据我所知,我的Web角色项目根本不应该尝试加载非托管的Hunspellx64.dll。这应该由托管的NHUnspell DLL来处理。作为构建步骤,该DLL被复制到Web角色的/bin目录中。
更新:感谢Thomas关于WebActivator过时的评论,我得以解决这个问题。我正在复制我对他接受的答案的回复评论,以确保其他有这个问题的人看到解决方案:
在这个错误开始之前,我让NHUnspell成功工作正在发生。坏东西是安装AttributeRoutingNuGet。AttributeRouting拖动旧版本的WebActivator(1.0.0.0)。不幸的是,NuGet不建议在执行更新操作。您必须手动进行更新按照本网页的说明通过Package Manager控制台:
http://www.nuget.org/packages/WebActivator
以下是收到修复之前原始帖子的其余部分:
我已经在我的项目中搜索了对Hunspellx64.dll的直接引用/链接,包括我的NuGet包配置、packages.config、web.config、我的引用列表、原始项目文件等。我找不到对该dll的任何直接引用。我还可以在哪里查找,或者我还可以尝试什么来阻止我的项目直接加载该非托管DLL?以下是ASP.NET错误转储:
[BadImageFormatException: Could not load file or assembly 'Hunspellx64.dll' or one of its dependencies. The module was expected to contain an assembly manifest.]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152
System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark) +102
System.Reflection.Assembly.LoadFrom(String assemblyFile) +34
WebActivator.PreApplicationStartCode.Start() in D:'Code'Bitbucket'WebActivator'WebActivator'PreApplicationStartCode.cs:11
[InvalidOperationException: The pre-application start initialization method Start on type WebActivator.PreApplicationStartCode threw an exception with the following error message: Could not load file or assembly 'Hunspellx64.dll' or one of its dependencies. The module was expected to contain an assembly manifest..]
System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +550
System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +132
System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) +90
System.Web.Compilation.BuildManager.ExecutePreAppStart() +135
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +516
[HttpException (0x80004005): The pre-application start initialization method Start on type WebActivator.PreApplicationStartCode threw an exception with the following error message: Could not load file or assembly 'Hunspellx64.dll' or one of its dependencies. The module was expected to contain an assembly manifest..]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9874568
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254
WebActivator Start方法不处理bin文件夹中的非托管DLL。正如您在代码文件中看到的:https://bitbucket.org/dfowler/webactivator/src/4c558d93cf3a/WebActivator/PreApplicationStartCode.cs
public static void Start() {
lock (initLock) {
if (!hasInited) {
// Go through all the bin assemblies
foreach (var assemblyFile in GetAssemblyFiles()) {
var assembly = Assembly.LoadFrom(assemblyFile);
// Go through all the PreApplicationStartMethodAttribute attributes
// Note that this is *our* attribute, not the System.Web namesake
foreach (PreApplicationStartMethodAttribute preStartAttrib in assembly.GetCustomAttributes(
typeof(PreApplicationStartMethodAttribute),
inherit: false)) {
// If it asks to be called after global.asax App_Start, keep track of the method. Otherwise call it now
if (preStartAttrib.CallAfterGlobalAppStart && HostingEnvironment.IsHosted) {
attribsToCallAfterStart.Add(preStartAttrib);
}
else {
// Invoke the method that the attribute points to
preStartAttrib.InvokeMethod();
}
}
}
Start()方法将所有DLL加载为要探测其PreApplicationStartMethodAttribute的程序集。对于非托管DLL,由于没有程序集清单,该操作失败。
看起来您使用的是分支(dfolwler?)或WebActivator的过时版本,因为当前版本可以通过忽略程序集加载时的所有异常来处理此问题。
private static IEnumerable<Assembly> Assemblies
{
get
{
if (_assemblies == null)
{
// Cache the list of relevant assemblies, since we need it for both Pre and Post
_assemblies = new List<Assembly>();
foreach (var assemblyFile in GetAssemblyFiles())
{
try
{
// Ignore assemblies we can't load. They could be native, etc...
_assemblies.Add(Assembly.LoadFrom(assemblyFile));
}
catch
{
}
}
}
return _assemblies;
}
}
将WebActivator更新到最新版本。