无法加载文件或程序集 'Magick.NET-x86.DLL' 或其依赖项之一。指定的模块无法找到

Could not load file or assembly 'Magick.NET-x86.DLL' or one of its dependencies. The specified module could not be found

我看过票 “Could not load file or assembly 'Magick.NET-x86.DLL' or one of its dependencies” by Harsh Gupta 我也遇到了同样的问题,但这些解决方案都不适合我。

我有一个包含 ImageMagick 的 Web 应用程序,它刚安装在新的 Windows Server 2012 实例上(我们正在从 Windows Server 2008 R2 实例迁移到该实例)。该应用程序在 Server 2008 和本地运行正常,但在 Server 2012 上运行不正常。

我在将 Magick.Net 从 6.8.7.502 升级到 7.0.7.300 后重建了项目,希望 .Net Standard / .Net Core support mentioned in the Readme, introduced in 7.0.6, would solve my problem, but to no avail. Before doing that, I had also installed VC++ 2012 and 2015 as Harsh Gupta mentioned in their accepted answer.

尽管如此,我仍然收到一个 "HTTP Error 500.0 - Internal Server Error" 页面,告诉我:

Module: AspNetInitializationExceptionModule
Notification: BeginRequest
Handler: ExtensionlessUrlHandler-Integrated-4.0
Error Code: 0x00000000
Requested URL: [redacted]
Physical Path: [redacted, but correct]
Logon Method: Not yet determined
Logon User: Not yet determined

事件日志显示来自 ASP.NET 4.0.30319.0 的警告事件,事件 ID 为 1310 和以下堆栈跟踪:

Event code: 3008 
Event message: A configuration error has occurred. 
Event time: 9/20/2017 6:20:40 PM 
Event time (UTC): 9/20/2017 6:20:40 PM 
Event ID: 4775ecdb4601401ca30aa057f77ae78a 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: [redacted]
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: [redacted]
    Machine name: [redacted]

Process information: 
    Process ID: 5096 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\[redacted]

Exception information: 
    Exception type: ConfigurationErrorsException 
    Exception message: Could not load file or assembly 'Magick.NET-x86.DLL' or one of its dependencies. The specified module could not be found.
   at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)
   at System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()
   at System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai)
   at System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)
   at System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies()
   at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded)
   at System.Web.Compilation.BuildManager.ExecutePreAppStart()
   at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Could not load file or assembly 'Magick.NET-x86.DLL' or one of its dependencies. The specified module could not be found.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)



Request information: 
    Request URL: [redacted] 
    Request path: / 
    User host address: [redacted]
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: IIS APPPOOL\[redacted]

Thread information: 
    Thread ID: 8 
    Thread account name: IIS APPPOOL\[redacted]
    Is impersonating: False 
    Stack trace:    at System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)
   at System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()
   at System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai)
   at System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)
   at System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies()
   at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded)
   at System.Web.Compilation.BuildManager.ExecutePreAppStart()
   at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)


Custom event details: 

查看 webroot,bin 文件夹确实包含 Magick.NET-x86.dll(以及 Magick.NET-Q16-x86.dll 和 Magick.NET-Q16-x86.Native.dll),并且 IIS_IUSRs 组确实具有对这些 DLL(以及所有其他 DLL)的读取权限。

虽然它是 64 位服务器,但 AppPool 确实将 启用 32 位应用程序 设置为 True。将 AppPool 的 Managed Pipeline ModeIntegrated 更改为 Classic 也没有任何效果。但是,我确实注意到,AppPool 的应用程序数量被列为零(尽管网站的高级设置对话框显示了正确的 AppPool 名称):

我完全不知所措,我们现在在迁移此应用程序方面落后于计划,因此我们将不胜感激地收到任何建议。

谢谢!

编辑添加: 票证 #107 on Github 中有更多信息。

我没有答案,但有一些关于故障排除的想法,尽管你可能尝试过这些。

  1. 您提到应用程序池未显示应用程序。尝试重新创建应用程序池或使用预先存在的应用程序池之一作为临时选项,以查看应用程序池是否存在问题。
  2. 您使用的是我想要的 apppool,这是最好的,但确实会帮助更改为网络服务帐户,如果是,则指向权限问题。
  3. 您是否比较了新旧服务器上安装的 Windows 功能?只是想知道它是否需要 WCF。
  4. bin目录是否在iis中被赋予执行权限
  5. 基本的 aspx 页面是否正常工作,或者配置是否也破坏了这些页面。

也许您已经尝试了所有这些,但希望它能为您提供另一个方向,即使它没有直接帮助。

尝试使用 Global Assembly Cache Tool (gacutil.exe) 将缺少的程序集发布到 GAC:

gacutil.exe /i Magick.NET-x86.dll /f
gacutil.exe /i Magick.NET-Q16-x86.dll /f 
gacutil.exe /i Magick.NET-Q16-x86.Native.dll /f

当 .NET 运行时无法在本地路径中找到项目引用的程序集时,它会扫描 GAC 中的程序集。我们通常将 GAC 用于由多个应用程序共享的程序集,但我们可以尝试使用这种方法进行故障排除。

如果有问题的应用程序在将这些程序集发布到 GAC 后成功运行,则使用它们的项目中的程序集引用属性可能存在问题。

经过测试,我们可以删除我们从GAC添加的程序集:

gacutil.exe /u Magick.NET-x86 
...

gacutil.exe 随 .NET Windows SDK 一起提供。为避免在服务器上安装它,我们可以使用 PowerShell 安装程序集:

[Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices") > $null
[System.EnterpriseServices.Internal.Publish] $publisher = new-object System.EnterpriseServices.Internal.Publish
$publisher.GacInstall('Path\To\Magick.NET-x86.dll')

这两个工具都需要服务器的管理员权限。

In a separate conversation on Github 与 ImageMagick 的创建者一起,我们最终检查了 DLL 的版本号,这让我们意识到——以及预期的文件 Magick.NET-Q16-x86.dllMagick.NET-Q16-x86-Native.dll 都在版本 7.0.7.300 — 还有一个文件 Magick.NET-x86.dll 是版本 6.8.7.502.

直接引用Dirk Lemstra

The Magick.NET-x86.dll file is an old file that should not be there. Can you remove that file and check if that resolves your issue? I apologize for not noticing this much earlier.

You no longer need to install the C++ redistributable. The necessary libraries are statically linked which means that you don't need to install that anymore.

删除那个多余的文件已经解决了问题。