ASP.NET MVC应用程序中的非托管DLL导致IIS服务器上的应用程序池停止



我的ASP.NET MVC应用程序使用用C++编写的非托管外部DLL。

此网站在Visual Studio中运行良好,可以正确定位和访问外部DLL。但是,当网站发布在本地Web服务器(运行IIS 7.5)而不是Visual studio IIS Express上时,我会收到以下错误:

HTTP Error 503. The service is unavailable.

外部DLL位于网站的bin目录中。在查看IIS日志时,我注意到每次调用dll时,defaultapppool都会停止。

HTTP/1.1 GET /Bio/Select/3 503 1 Disabled DefaultAppPool

我尝试过以下几种:

  1. 我把DLL放在System32和syswow64文件夹中
  2. 将ASPNET、IIS_WPG和IUSR(针对该服务器)的全部权限授予网站bin目录并重新启动
  3. 将外部DLL作为现有项添加到项目中,并将其"复制到输出"属性设置为"始终复制"
  4. 发布了目标平台x86的应用程序,因为dll是32位的
  5. 我有IIS运行在集成模式启用32位
  6. 我将dll放在\System32\Inetsrv目录中

下面是我如何调用dll 的代码片段

     [HttpGet]
    public ActionResult Select(int ID)
    {
        int res = BSSDK.BS_InitSDK();
        if (res != BSSDK.BS_SUCCESS)
        {
           ModelState.AddModelError("Error", "SDK failed to initialise");
        }
        return View()
     }
   public class BSSDK
{
    [DllImport("BS_SDK.dll",
        CharSet = CharSet.Ansi,
        EntryPoint = "BS_InitSDK")]
    public static extern int BS_InitSDK();
 }

我的视图

@model IEnumerable<BasicSuprema.Models.BioUser>
@using GridMvc.Html
@{
    ViewBag.Title = "Bio Users On DB";
}
<div class="well well-sm"><h3>@ViewBag.Title</h3></div>
@Html.ValidationMessage("Error")
<div class="grid-wrap">
    @Html.Grid(Model).Named("UsersGrid").Columns(columns =>
                    {
                        columns.Add(c => c.BioUserID).Titled("ID");
                        columns.Add(c => c.UserName).Titled("User");
                    }).WithPaging(10).Sortable(true)
</div>

类似的问题包括无法在ASP.NET服务器上加载非托管DLL如何在ASP.NET网站中调用非托管代码并将其托管在IIS 中

无法从ASP.NET 调用DLL

当我在运行IIS 8的web服务器上托管它时,我得到以下错误。因此,也许在我的本地IIS服务器上,它返回错误503,因为它找不到dll,但还没有确定这一点,因为对于托管的服务器,我没有权限将dll复制到系统文件夹。

Unable to load DLL 'BS_SDK.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

为了找出应用程序在哪里搜索dll,我推荐使用Microsoft FusionLog。它不仅会记录CLR搜索dll的位置,还会记录加载失败原因的更多详细信息。

此外,查看进程是否真的打开了dll的文件句柄可能会有所帮助。您可以通过Process Explorer找到:*下载ProcessExplorer并以管理员身份运行它。*为"进程名称"添加筛选器并使用"w3wp.exe"*启动应用程序池*在进程资源管理器中搜索"BS_SDK.dll",您会看到它试图从哪个目录加载它。

我重新卸载并安装了IIS,然后重复了问题中所述的所有步骤,最终成功了。

相关内容

最新更新