Не удалось загрузить файл или сборку Hunspellx64.dll при использовании пакета NHUnspell NuGet?

У меня есть веб-роль ASP.NET/MVC, в которой используется пакет NHUnspell NuGet. Когда я пытаюсь запустить его, я получаю следующее сообщение об ошибке:

Could not load file or assembly 'Hunspellx64.dll' or one of its dependencies. The module was expected to contain an assembly manifest.

Это странно, потому что, насколько я знаю, мой проект веб-роли вообще не должен пытаться загрузить неуправляемый файл Hunspellx64.dll. Это должно быть обработано управляемой DLL-библиотекой NHUnspell. Эта DLL копируется в каталог / bin веб-роли в качестве шага сборки.

ОБНОВЛЕНИЕ: Благодаря комментарию Томаса об устаревании WebActivator я смог решить проблему. Я дублирую свой ответный комментарий на его принятый ответ, чтобы другие пользователи, имеющие эту проблему, увидели исправление:

Я имел NHUnspell, работающий успешно, прежде чем эта ошибка начала происходить. То, что сломало вещи, было установлением AttributeRouting с NuGet. AttributeRouting перетаскивает в старую версию WebActivator (1.0.0.0). К сожалению, NuGet не предлагает обновить его при выполнении операции обновления. Вы должны вручную выполнить обновление через консоль диспетчера пакетов, следуя инструкциям на этой веб-странице:

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

1 ответ

Решение

Метод запуска WebActivator не обрабатывает неуправляемые библиотеки DLL в папке bin. Как вы видите в файле кода: 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 до последней версии.

Другие вопросы по тегам