Method произошла внутренняя ошибка при вычислении выражения

Я столкнулся с проблемой в оценщике выражений Visual Studio 2015, которая говорит: «Внутренняя ошибка в оценщике выражений». После некоторых исследований я обнаружил, что это вызвано сборкой, загруженной с использованием отражения. Эта сборка не будет генерировать никаких исключений, но после этого оценщик vs exp завершится ошибкой. Это не единственная сборка, которую я загружаю, есть несколько хороших рабочих, которые не влияют на оценщик.

Чтобы решить эту проблему, мне пришлось проверить «Меню> Параметры> отладка> Использовать управляемый режим совместимости», но это отключает функцию «Изменить и продолжить», что я могу сделать?

Свойства сборки причинителя:

  • его имя такое же, как у основной сборки (я изменил его имя, но ничего не произошло)
  • все мои проекты используют dotNet 4.5
  • все корневые пространства имен одинаковы (таковы все сборки)

Благодарность!

8 ответов

Лучший ответ

Похоже на ошибку в оценщике выражений. Для лучшего обходного пути вместо проверки «Использовать управляемый режим совместимости» установите флажок «Использовать устаревшие средства оценки выражений C # и VB». Это должно позволить вам продолжать использовать «Изменить и продолжить», а также другие функции, добавленные в последних нескольких выпусках.

Что касается «Внутренней ошибки в оценщике выражений», не могли бы вы открыть проблему, выбрав «Справка» -> «Отправить отзыв» -> «Сообщить о проблеме»? Это поможет нам решить проблему в будущих выпусках.


77

Patrick Nelson — MSFT
31 Дек 2015 в 18:50

Я столкнулся с ошибкой «внутренняя ошибка в оценщике выражений», когда отлаживал в режиме выпуска, а не в режиме отладки. Я изменил его на Release при публикации в производство и забыл вернуть его на Debug.

Release Mode

Debug Mode


1

MsTapp
18 Ноя 2016 в 18:52

В моем случае я пытался оценить лямбда-выражение в List <> и имел такую ​​ошибку («Внутренняя ошибка в оценщике выражений»). Я использовал VS2015, поэтому лямбда-выражения были разрешены. Оказывается, в оценщике выражений не хватало библиотеки Linq. я добавил

using System.Linq;

В мой нынешний класс и вуаля! Лямбда оценена.


1

pilak
9 Ноя 2016 в 14:03

Просто расширение на решение, предоставленное Патриком Нельсоном . Для Visual Studio 2015+, как и требовалось, выполните следующие действия.

Если вы в данный момент отлаживаете, эта опция будет недоступна. Остановите отладчик.

Откройте Инструменты -> Параметры .

VS Options

И здесь в разделе Параметры выберите Отладка -> Общие и прокрутите вниз, чтобы найти параметр … устаревшее выражение C # .. :

VS Options Debug Legacy options

Более подробная информация представлена ​​здесь:

Переход в режим управляемой совместимости

Примечание. Переход в устаревший режим также имеет ряд серьезных недостатков. В частности, отражение времени выполнения реализованных интерфейсов становится практически невозможным или крайне неудобным. Есть также другие методы отражения, которые вызывают ошибки.


36

UuDdLrLrSs
28 Янв 2020 в 14:12

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


2

Brandon
11 Апр 2018 в 12:58

Проверьте, используете ли вы атрибут [DebuggerBrowsable]; Я нашел минимальный кейс в VisualStudio 2017 15.5 и разместил его здесь.

В этом конкретном случае сбой вычислителя выражений (EE) появляется, связанный с атрибутом [DebuggerBrowsable], примененным к свойству, перекрывающему поле с тем же именем. Это составит некоторый процент случаев, с которыми сталкиваются люди, но невозможно узнать, сколько из них связано с этой конкретной проблемой, пока она не будет исправлена.

Полный и полный демонстрационный пример показан на изображении (и ниже для удобства)

enter image description here

Машиночитаемая копия кода на картинке:

using System;
using System.Diagnostics;

class Program { static void Main() => new _derived(); }

abstract class _base
{
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public Object trace;
};

class _derived : _base
{
    public _derived() => Debugger.Break();      // <-- vs2017 EE crash when stopped here

    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    new public Object trace => base.trace;
}


0

Glenn Slayden
9 Фев 2018 в 03:36

В моем случае у меня было 2 одинаковых файла dll в 2 разных папках (кажется, одна dll была неправильной). Удаление .dll и решение для восстановления решили мою проблему.


0

constructor
15 Май 2018 в 10:51

Для меня сработала опция «Использовать управляемый режим совместимости». Я также видел вопросительные знаки при наведении курсора на переменные, а не на свойства и значения.


4

Talha Anwer
28 Ноя 2016 в 21:05

Преобразование значения к типу Число не может быть выполнено 1С 8. 3 — как исправить?

Преобразование значения к типу Число не может быть выполнено 1С 8.3 — как исправить?

При написании кода 1С или проведения бухгалтерских операций в системе 1С 8.3 и более ранних системах вы можете столкнуться с уведомлением « Преобразование значения к типу Число не может быть выполнено ». Причиной ошибки обычно является попытка программиста преобразовать в число значение, которое числовым быть не может. Ниже разберём суть данной ошибки, а также представим возможные варианты её решения.

Причины ошибки выполнения преобразования значения к типу Число

Обычно данная проблема возникает при запуске кода, выполнении процедуры проверки кода на ошибки или при осуществлении стандартных операцией составления отчётности в системе 1С 8.3 (и ранних системах).

В частности, ошибка фиксировалась в следующих обстоятельствах:

Давайте разберём, как устранить ошибку «Преобразование значения к типу Число не может быть выполнено» в конфигурации 1С 8.3.

Прежде чем разбирать особенности ошибок в коде 1С, рекомендуем обновить вашу 1С до самой актуальной версии. В некоторых случаях ошибка «преобразование значения к типу число» вызвана устаревшим вариантом системы, на которой специалист пытается вести отчётность. Установите наиболее актуальную версию системы, и рассматриваемая нами ошибка может исчезнуть.

Внимательно проверьте код на наличие переменных

В большинстве случаев рассматриваемая ошибка вызвана невнимательностью программиста, вместо числового значения указавшего не числовое, что не позволяет системе выполнить правильный подсчёт числовых значений. Рекомендуем внимательно проверить создаваемый вами код, найти место в коде вызывающее исключение (ошибку) и пофиксить его.

Например, в примере:

Переменная B будет вести к ошибке так как её формат не позволяет системе сложить числовое значение «А» и значение в форме даты. Для решения проблемы замените B на строку: B=5 или аналогичную. В этом случае система выдаст вам корректный результат (в данном случае это будет 8).

Измените первый тип слагаемого на число

В некоторых случаях платформа 1С анализирует тип первого слагаемого числа, обнаруживает строку, вследствие чего может решить, что в данном коде речь идёт о сложении строк, а не необходимых программисту числах. Вследствие этого она пытается выполнить преобразование каждого слагаемого в строку, после чего объединить их как строки.

Для решения проблемы необходимо использовать скобки, позволяя системе вначале выполнить вычисление результата в скобках как суммы чисел, а уже потом преобразовать результат в строку.

К примеру, вместо ошибочной строки:

Сообщить(«Результат: » + 7 + 8 + 9);

Будет необходимо использовать строку:

Сообщить(«Результат: » + (7 + 8 + 9));

Вследствие этого вы получите ожидаемый результат в виде числе 24.

Используйте конфигуратор для нахождения исключения кода

При возникновении ошибки и соответствующего сообщения «Преобразование значения к типу Число не выполнено» в системе 1С 8.3 рекомендуем использовать конфигуратор для нахождения кода. Последний способен в режиме отладки определить и указать на ошибку.

Порядок действий в этом случае будет следующим:

Переиндексируйте ваши файлы

В некоторых редких случаях исправить ошибку «Преобразование значения к типу Число» может помочь переиндексация ваших файлов. Для версии 1С 8.3 стоит использовать файл chdbfl. exe, запускающий переиндексацию. Обычно данный файл находится по пути C:\Program Files (x86) \1cv8\8.3ХХХ\bin. Вместо ХХХ у вас могут находиться указатели вашей версии продукта.

Запустите данный файл, укажите имя файла для проверки, поставьте галочку рядом с опцией «Исправлять обнаруженные ошибки», после чего нажмите на «Выполнить внизу». Дождитесь завершения процедуры проверки и исправления, после чего вновь попробуйте выполнить необходимые операции.

Используйте функцию «Есть NULL»

Если выскакивает ошибка, то иногда одна из задействуемых переменных может принимать значение NULL. Для исправления ошибки рекомендуется использовать функцию «ЕСТЬNULL» (переменная, 0), что позволит устранить рассматриваемую в статье проблему.

Заключение

В нашем материале мы рассмотрели причины появления уведомления «Преобразование значения к типу Число не может быть выполнено» в версии системы 1С 8.3, и как исправить возникшую проблему. Поскольку фактором ошибки обычно выступает невнимательность программиста, внимательно изучите ваш код на наличие нечисловой переменной, часто используемой в арифметическом уравнении. Замена данной переменной на числовую, а также выполнение других перечисленных нами советов поможет устранить рассмотренную нами ошибку в вашей системе.

Попытка в 1С

В чем суть этого оператора? В ходе выполнения программы часто могут возникать ошибки, такие как деление на ноль, корень из отрицательного числа и прочие. Эти ошибки приводят к «крушению» программы – это значит, что программа прекратит свою работу и ни какие операторы после ошибки выполняться не будут. Чтобы обойти исключительную ситуацию и продолжить выполнение программы, в языке программирования 1С существует оператор Попытка…Исключение.

Рассмотрим его синтаксис.

Попытка

//операторы попытки

Исключение

//операторы исключения.

КонецПопытки

Разберем этот синтаксис.

Ключевое слово Попытка открывает список операторов, выполнение которых может привести к исключительной ситуации, все операторы между ключевыми словами Попытка и Исключение это Операторы попытки.

Ключевое слово Исключение открывает список операторов, которые будут выполняться в том случае, если вызвана исключительная ситуация операторами попытки. Т. е. если во время выполнения программы один из операторов попытки вызвал ошибку выполнения программы (исключительную ситуацию), то выполнение данного оператора прерывается и управление передается на первый Оператор исключения. Причем обращаю Ваше внимание, что управление будет передано и в том случае, если исключительную ситуацию вызвали функции и процедуры, разработанные программистом и применяемые в качестве операторов попытки. Естественно, что если ошибка произошла в процедуре или функции, то ее выполнение будет прервано.

В примере выше, я пытаюсь извлечь квадратный корень из какого-то числа. Если число под корнем больше нуля, то корень прекрасно извлечется, и выйдет соответствующее сообщение. А если число под корнем меньше нуля, то программа сообщит об этом, и выполнение не будет завершено аварийно.

Таким образом, в примере выше вычисление квадратного корня и вывод сообщения являются операторами попытки. Между словом Исключение и КонецПопытки располагаются операторы исключения. На эти операторы перейдет программа после вызова исключения (когда число под корнем меньше нуля). Операторы попытки, следующие после строки, где была инициализирована ошибка, исполняться не будут, т. е. сообщение чему равен квадратный корень из числа мы не увидим, если оно отрицательное.

Описание ошибки в 1С

В коде выше я использовал собственное выражение для описания ошибки, но можно использовать метод ОписаниеОшибки(), который возвращается описание ошибки с точки зрения разработчиков платформы 1С. Это функция, которая возвращает текст с описанием ошибки. Например, код выше можно переделать так:

Тогда, при выполнении выйдет «стандартизированное» описание ошибки.

Оператор ВызватьИсключение в 1С

Если мы всё сделаем правильно, то никакой ошибки не возникнет, просто выйдет сообщение о корне из отрицательного числа. А что если нам нужно, чтобы все-таки ошибка вышла? Для этого есть оператор ВызватьИсключение.

Если сейчас мы попробуем посчитать корень из отрицательного числа, то выйдет следующее сообщение:

Оператор ВызватьИсключение можно использовать отдельно для «эмуляции» вызова исключение. Например, при выполнении этой команды формы:

Будет вызвано исключение.

Причём, в открывавшемся окне можно посмотреть место в коде, где было вызвано исключение.

Попытка внутри попытки в 1С

В платформе 1С 8.3 можно один оператор попытки разместить в другом операторе. Например, на управляемой форме обработки разместим несколько реквизитов с типом Число.

И по команде с формы попытаемся вычислить корень из каждого реквизита, при этом сделаем это в двух вложенных операторах попытки.

И результат работы этой обработки:

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Книга написана понятным и простым языком — для новичка.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
Промо-код на скидку в 300 рублей на весь комплект: Blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

Можно оплатить вручную:

Яндекс. Деньги — 410012882996301
Web Money — R955262494655

Источники:

Https://rusadmin. biz/oshibki/preobrazovanie-k-tipu-chislo-ne-vypolneno-1c-8-3/

Https://www.1s-up. ru/popytka-v-1s/

Я столкнулся с проблемой в оценке выражений визуальной студии 2015, в которой говорится «Внутренняя ошибка в оценщике выражений», после некоторых исследований я обнаружил, что это вызвано сборкой, которая загружается с использованием отражения. Эта сборка не выдавала бы никаких исключений, но после этого, vs exp оценщик потерпит неудачу.
Это не единственная сборка, которую я загружаю, есть хорошие рабочие, которые не влияют на оценщика.

Чтобы преодолеть эту проблему, мне пришлось проверить «Меню > параметры > отладкa > Использовать режим управляемой совместимости», но это отключает функцию «Изменить и продолжить», что я могу сделать?

Свойства сборки причинителя:

  • его имя совпадает с именем главной сборки
     (я изменил его имя, но ничего не произошло)
  • Во всех моих проектах используется dotNet 4.5
  • все корневые пространства имен одинаковы
     (все сборки являются такими)

Спасибо!

4b9b3361

Ответ 1

Это звучит как ошибка в оценщике выражений. Для лучшего обходного пути вместо проверки «Использовать режим совместимой совместимости» установите флажок «Использовать устаревшие оценщики выражений С# и VB». Это должно позволить вам продолжать использовать Edit и Continue, а также другие функции, добавленные в последние несколько выпусков.

В терминах «Внутренняя ошибка в оценщике выражений», пожалуйста, откройте проблему, перейдя в Help → Отправить отзыв → Сообщить о проблеме? Это поможет нам устранить проблему в будущих выпусках.

Ответ 2

Просто продолжая решение, предоставленное Патриком Нельсоном. Для Visual Studio 2015+ по запросу следующие шаги.

Перейдите в раздел Инструменты Параметры.
VS Options

и здесь в разделе «Параметры» выберите Отладка Общие и прокрутите вниз, чтобы найти… выражение устаревшего языка С#..

VS Options Debug Legacy options

Дополнительная информация приведена здесь:

Переход в режим совместимой совместимости

Примечание. Есть также некоторые серьезные недостатки, возникающие при переходе в устаревший режим. Особенно Runtime Reflection реализованных интерфейсов становится почти невозможной или крайне неудобной. Существуют и другие методы Reflection, которые будут вызывать ошибки.

Ответ 3

Я столкнулся с ошибкой «внутренняя ошибка в выражении», когда я отлаживался в режиме деблокирования, а не в режиме отладки. Я изменил его на Release при публикации на производство и забыл изменить его обратно на Debug.

Режим выпуска

Режим отладки

Ответ 4

В моем случае я пытался оценить выражение лямбда в List < > и имел такую ​​ошибку ( «Внутренняя ошибка в оценщике выражений» ). Я использовал VS2015, поэтому допускались лямбда-выражения. Оказывается, у экспансивного оценщика не было библиотеки Linq. Я добавил

using System.Linq;

моему текущему классу и вуаля! Оценено Lambda.

Ответ 5

Для меня проверена опция «Использовать управляемый режим совместимости». Я также видел вопросительные знаки при наведении на переменные вместо свойств и значений

#c# #mysql

#c# #mysql

Вопрос:

Я получаю эту ошибку,

Невозможно вычислить выражение, потому что код оптимизирован или собственный фрейм находится поверх стека вызовов.

И я не знаю, что является его причиной.

Существует два метода входа в систему и выбора сеанса. Сеанс входа в систему просто соответствует электронной почте и паролю; и выбор сеанса запрашивает БД с идентификатором GUID, который будет использоваться в качестве идентификатора сеанса. Ошибка выдается при вызове SessionSelection() входа в систему

 private void SessionSelection( )
{


 string connectstr = "data source=.\SQLEXPRESS;Integrated Security=True; Initial Catalog= NewApp";

    try
    {
        string query = @"SELECT UserIDkey FROM Registration WHERE Email='"   txtEmail.Text.Trim()   "'";

        SqlConnection con = new SqlConnection(connectstr);
        SqlCommand cmd = new SqlCommand(query, con);
        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            string SessionResult = reader["UserIDkey"].ToString();
            Session["PrivateKey"] = SessionResu<

            //SessionResult = SpecialKey;
        }
        reader.Close();
        con.Close();
    }
    catch
    {
    }

}


private void Login()
{

    string passwordEncryption = txtPassword.Text.Trim();

    System.Security.Cryptography.MD5CryptoServiceProvider x2 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    byte[] bs2 = System.Text.Encoding.UTF8.GetBytes(passwordEncryption);
    bs2 = x2.ComputeHash(bs2);
    System.Text.StringBuilder s2 = new System.Text.StringBuilder();
    foreach (byte b in bs2)
    {
        s2.Append(b.ToString("x2").ToLower());
    }
    string EncryptedPassword = s2.ToString();


    if (!string.IsNullOrEmpty(txtEmail.Text))
    {
        string connectstr = "data source=.\SQLEXPRESS;Integrated Security=True; Initial Catalog= NewApp";
        //  (ConfigurationManager.AppSettings["connectionString"]); 
        try
        {
            string query = @"SELECT * FROM Registration WHERE Email='"   txtEmail.Text.Trim()   "'and Password='"   EncryptedPassword   "'";

            SqlConnection con = new SqlConnection(connectstr);
            SqlCommand cmd = new SqlCommand(query, con);

            con.Open();

            var Results = (int)cmd.ExecuteScalar();

            //string sqlRead = cmd.ExecuteReader().ToString();

            if (Results > 0)
            {


                SessionSelection();

                txtEmail.Text = "";
                txtPassword.Text = "";
                Response.Redirect("~/Home.aspx");
            }

            else
            {
                Response.Write("Incorrect UserName/Password");
            }
            con.Close();
        }


        catch (Exception ex)
        {
            Response.Write("Incorrect UserName/Password");
        }
    }
  

Комментарии:

1. Что вы получили, когда погуглили свое сообщение об ошибке?

2. Где я вызываю SessionSelection() при входе в систему

Ответ №1:

Проблема: вы не указываете пробел между Email string and ключевым словом и в командной строке в Login() методе:

 string query = @"SELECT * FROM Registration WHERE Email= 
         '"   txtEmail.Text.Trim()   "'and Password='"   EncryptedPassword   "'";
                                      ^^^  
  

Решение: вам нужно иметь пробел между вашим Email string и and ключевым словом в командной строке в Login() методе:

Попробуйте это:

 string query = @"SELECT * FROM Registration WHERE Email= 
      '"   txtEmail.Text.Trim()   "' and Password='"   EncryptedPassword   "'";
  

Предложение: ваш запрос открыт SQL Injection attacks , поэтому я настоятельно рекомендую вам использовать Parameterised queries , чтобы избежать SQL Injection attacks .

Решение 2: с Parameterised queries

 try
{
    string query = @"SELECT * FROM Registration WHERE Email=@Email 
                                                        and Password=@Password";
    SqlConnection con = new SqlConnection(connectstr);
    SqlCommand cmd = new SqlCommand(query, con);
    cmd.Parameters.AddWithValue("@Email",txtEmail.Text.Trim());
    cmd.Parameters.AddWithValue("@Password",EncryptedPassword);
    con.Open();
    var Results = (int)cmd.ExecuteScalar();
    //string sqlRead = cmd.ExecuteReader().ToString();
    if (Results > 0)
    {
        SessionSelection();
        txtEmail.Text = "";
        txtPassword.Text = "";
        Response.Redirect("~/Home.aspx");
    }
    else
    {
        Response.Write("Incorrect UserName/Password");
    }
    con.Close();
}
  

Ответ №2:

Проблема заключалась в ответе.Перенаправление («~/Home.aspx», false);

Чтобы обойти эту проблему, используйте один из следующих методов: Для ответа.Завершение, вызовите HttpContext.Current .ApplicationInstance.Метод CompleteRequest вместо ответа.Завершите, чтобы обойти выполнение кода для события Application_EndRequest. Для ответа.Перенаправление, использование перегрузки, ответ.Перенаправление (URL-адрес строки, bool endResponse), которое передает false для параметра endResponse, чтобы подавить внутренний вызов Response.End . Например: ответ.Перенаправление («nextpage.aspx», false);

Если вы используете это обходное решение, код, следующий за ответом.Выполняется перенаправление. Для сервера.Передача, использование сервера.Вместо этого выполните метод.

Исправить ответ.Перенаправление («~/Home.aspx», false);

Понравилась статья? Поделить с друзьями:
  • Metro 2033 redux ошибка previous launch was unsuccessful
  • Metro 2033 redux не запускается ошибка
  • Metro 2033 physxloader dll ошибка windows 10
  • Metro 2033 exe системная ошибка
  • Mercury кассовый аппарат ошибка 453