Неуправляемая DLL в приложении ASP.NET MVC приводит к остановке пула приложений на сервере IIS

В моем приложении ASP.NET MVC используется неуправляемая внешняя DLL, написанная на С++.

Этот сайт отлично работает в Visual Studio, правильно размещая и получая доступ к внешним DLL. Однако, когда веб-сайт публикуется на локальном веб-сервере (работает с IIS 7.5), а не в Visual Studio IIS Express, я получаю следующую ошибку:

HTTP Error 503. The service is unavailable.

Внешняя DLL находится в каталоге bin на веб-сайте. Когда я смотрю журналы IIS, я заметил, что defaultapppool останавливается каждый раз, когда я вызываю DLL.

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

Я пробовал следующее:

  • Я поместил DLL в папку System32 и syswow64.
  • Получил полные права на ASPNET, IIS_WPG и IUSR (для этого сервера) в каталог bin сайта и перезагрузился.
  • Добавлена ​​внешняя библиотека DLL в качестве существующих элементов для проектов и установите для свойства "Копировать в вывод" значение "Копировать всегда".
  • Опубликованное приложение с целевой платформой x86, поскольку dll 32-разрядная версия.
  • У меня IIS, работающий в режиме Интегрированного режима, разрешает 32 бит.
  • Я поместил 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>

Аналогичные вопросы включают Неуправляемые DLL файлы не загружаются на сервере ASP.NET Как вызвать неуправляемый код на веб-сайте ASP.NET и разместить его в IIS

Невозможно вызвать DLL из ASP.NET

Когда я размещал его на веб-сервере, на котором запущен IIS 8, я получаю следующую ошибку. Возможно, на моем локальном сервере IIS он возвращает ошибку 503 coz, он не может найти dll, но я еще не определил это как для размещенного. Я не имеют доступа для копирования dll в системные папки.

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

Ответ 1

Чтобы узнать, где ваше приложение ищет вашу DLL, я рекомендую Microsoft FusionLog. Он будет не только регистрировать, где CLR ищет DLL, но также регистрирует более подробную информацию о том, почему загрузка не удалась.

Кроме того, было бы полезно узнать, действительно ли процесс открывает дескриптор файла для dll. Вы можете узнать через Process Explorer:  * Загрузите ProcessExplorer и запустите его как администратор.  * Добавьте фильтр для "Имя процесса" и используйте "w3wp.exe"  * Запустите пул приложений  * Проводник поискового процесса для "BS_SDK.dll", и вы увидите, в какой директории он пытался его загрузить.

Ответ 2

Я удалил и установил IIS заново, а затем повторил все указанные шаги в вопросе и, наконец, работал.