2

我已经看到了Harsh Gupta 的票“无法加载文件或程序集 'Magick.NET-x86.DLL' 或其依赖项之一”,我遇到了同样的问题,但没有这些解决方案适合我。

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

我在将 Magick.Net 从 6.8.7.502 升级到 7.0.7.300 后重建了项目,希望7.0.6 中引入的自述文件中提到的 .Net Standard / .Net Core 支持能够解决我的问题,但是徒劳无功。在此之前,我还安装了 VC++ 2012 和 2015,正如 Harsh Gupta在他们接受的答案中提到的那样。

尽管如此,我仍然收到“HTTP 错误 500.0 - 内部服务器错误”页面,告诉我:

模块: AspNetInitializationExceptionModule
通知: BeginRequest
处理程序: ExtensionlessUrlHandler-Integrated-4.0
错误代码: 0x00000000
请求的 URL: [已编辑]
物理路径: [已编辑,但正确]
登录方法:尚未确定
登录用户:尚未确定

事件日志显示来自 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(以及所有其他)。

虽然它是 64 位服务器,但 AppPool 确实将Enable 32-bit applications设置为True。将 AppPool 的托管管道模式集成更改为经典也没有效果。但是,我确实注意到,AppPool 的应用程序数量被列为零(尽管网站的高级设置对话框显示了正确的 AppPool 名称): AppPools 截图

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

谢谢!

编辑添加:在 Github 上的票 #107 上有更多信息。

4

3 回答 3

2

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

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

也许您已经尝试了所有这些,但希望它可以帮助您获得另一个方向,即使它没有直接帮助。

于 2017-09-27T23:52:55.017 回答
1

尝试使用全局程序集缓存工具( 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')

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

于 2017-10-01T20:41:18.543 回答
1

在与 ImageMagick 的创建者在 Github 上进行的单独对话中,我们最终检查了 DLL 的版本号,这使我们意识到——以及预期的文件Magick.NET-Q16-x86.dllMagick.NET-Q16-x86-Native.dll版本7.0.7.300——还有一个文件Magick.NET-x86.dll是 version 6.8.7.502

直接引用Dirk Lemstra 的话

Magick.NET-x86.dll文件是不应存在的旧文件。您可以删除该文件并检查是否可以解决您的问题吗?我很抱歉没有早点注意到这一点。

您不再需要安装 C++ 可再发行组件。必要的库是静态链接的,这意味着您不再需要安装它。

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

于 2017-10-04T12:46:56.170 回答