AccessViolationException выдается при запуске веб-роли Azure в эмуляторе Azure.
Я получаю исключение System.AccessViolationException, возникающее во время выполнения веб-роли Azure (запущенной на эмуляторе Azure, она еще не загружена в Azure), когда выполняется вызов переопределенного метода объекта, когда локальная переменная int имеет значение передается как один из параметров метода. Сообщение об исключении: "Попытка чтения или записи в защищенную память. Это часто указывает на повреждение другой памяти".
Код, из которого выдается исключение, является частью локальной библиотеки, которая использовалась в течение нескольких лет на живых системах (не Azure) без проблем. Часть, что ошибки следующие:
foreach (XmlDataComponent item in this.items)
{
int index = 0;
XmlNode node = item.ToXml(dataSet, xmlDocument, this, index); // Exception thrown when this call is made
...
}
XmlDataComponent является базовым классом, когда элемент запуска кода является одним из его производных классов. Метод ToXml() переопределяется в производных классах. Исключение выдается, как только вызывается ToXml().
Проблема в параметре индекса. Если я поменяю это, чтобы использовать явное значение вместо локальной переменной, например
item.ToXml(dataSet, xmlDocument, this, 0)
нет ошибок
Точно так же, если я приведу предмет к его фактическому типу, например
((XmlDataItem)item).ToXml(dataSet, xmlDocument, this, index))
и пометить метод ToXml() в классе XmlDataItem как новый вместо переопределения, ошибок нет.
Я также попытался вызвать библиотеку из консольного приложения, а не из веб-роли с точно такими же данными (т. Е. Все то же самое, кроме работы в веб-роли). Опять же, это не вызвало проблем.
Похоже, что при запуске под эмулятором Azure доступ к локальной переменной в качестве параметра переопределенного метода является проблемой!!!
Я надеюсь, что это проблема только при запуске под эмулятором, однако нам все еще нужно исправить, иначе dev будет сложнее.
Любые предложения или советы будут высоко ценится.