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

时间:2015-03-25 06:15:35

标签: c# asp.net asp.net-mvc dll

我的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目录
  7. 以下是我如何调用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>
    

    类似问题包括Unmanaged DLLs fail to load on ASP.NET server How to call unmanaged code in ASP.NET website and host it in IIS

    Unable to call the DLL from ASP.NET

    当我在运行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)
    

2 个答案:

答案 0 :(得分:1)

为了找到您的应用程序搜索您的dll的 ,我建议使用Microsoft FusionLog。它不仅会记录CLR搜索dll的位置,还会记录有关加载失败原因的更多详细信息。

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

答案 1 :(得分:0)

我重新安装并重新安装了IIS,然后重复了问题中的所有步骤,最终完成了工作。