ASP.NET DllImport приводит к закрытию приложения - PullRequest
5 голосов
/ 31 мая 2011

Я сильно подозреваю, что моя проблема связана с какой-то проблемой безопасности, но вот полное описание на случай, если я ошибаюсь.

У меня есть DLL, которая была изначально написана на C (не C ++). Я использую DllImport для вызова методов в этой библиотеке. Объявление выглядит примерно так:

[DllImport(@"MyAntiquatedLibrary.dll")
[SecurityPermission(SecurityAction.Assert, Unrestricted = true)]
internal static extern void GetConnectionString(string port, string server, string instance, [Out] StringBuilder output);

Объявление C в заголовочном файле выглядит так:

void GetConnectionString(const char far *Portname, const char far *ServerName const char far *InstanceName, char far *retConnectionName);

Итак, я создал пример страницы в своем проекте WebApplication в Visual Studio, чей код выглядит следующим образом:

protected void Page_Load(object sender, EventArgs e)
{
  try
  {
    var connectionString = new StringBuilder();
    GetConnectionString(null, "myHost", "myInstance", connectionString);
    MyLabel.Text = connectionString.ToString();
  }
  catch(Exception ex)
  {
    MyLabel.Text = string.Format("Something went wrong: {0}", ex.Message);
  }
}

Когда я отлаживаю программу и перехожу вызов метода GetConnectionString (), я получаю:

AccessViolationException was unhandled.
Attempted to read or write protected memory.  This is often an indication that other memory is corrupt.

Я вижу ту же проблему с любыми вызовами, которые я делаю в DLL взаимодействия из веб-службы или веб-страницы в моем проекте WebApplication. Та же последовательность вызовов прекрасно работает в приложении ConsoleApplication, которое я написал при тестировании этого.

Тот же код отлично работает при вызове из приложения WindowsConsole. Пример немного упрощен от фактического использования, но результаты те же. В настоящем решении у меня есть проект, который отвечает за управление взаимодействиями с C-API, и это то, что вызывает мой веб-сервис, но я запустил приведенный выше пример и получил поведение, которое я объяснил.

Ответы [ 2 ]

1 голос
/ 01 июня 2011

В итоге проблема заключалась в том, что я неправильно инициализировал C-API. Есть вызов функции, который инициализирует весь API, и пока я делал это в своих UnitTests, я забыл сделать это в веб-сервисе.

Спасибо всем за помощь, но я чувствую, что многое узнал о модели безопасности ASP.NET и реализации доверия .NET.

1 голос
/ 01 июня 2011

Если ваш сервер IIS работает в 64-битной ОС, вы должны явно построить свой проект с целевым CPU = X86, иначе он будет рассматриваться как AnyCPU, и jit, вероятно, сгенерирует для него 64-битный собственный код.После этого вы можете включить 32-разрядные приложения в IIS, и ваш проект должен работать.Что еще нужно проверить, так это то, что ваша dll на самом деле обнаруживается вашим приложением asp.net.

...