Я сильно подозреваю, что моя проблема связана с какой-то проблемой безопасности, но вот полное описание на случай, если я ошибаюсь.
У меня есть 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, и это то, что вызывает мой веб-сервис, но я запустил приведенный выше пример и получил поведение, которое я объяснил.