Класс ошибки сборки решения не содержит определения для xxx, если определение существует и страница сборки работает

У меня есть класс с названием "Отчет" объявлен таким образом без определенного пространства имен, он объявлен как глобальное пространство имен.

using system;
//and other namespaces

public class Report
{
    public string CheckIfReportAccess(string name)
    {
        //logic here
    }
}

и я использую метод класса Report, подобный этому, в методе загрузки страницы веб-формы.

global::Report report = new global::Report();
if (!report.CheckIfReportAccess("xxx"))
{
    //logic here.
}

Проблема в том, что когда я построил решение, произошла ошибка

ERROR: 'Report' does not contain a definition for 'CheckIfReportAccess' and no extension method 'CheckIfReportAccess' accepting a first argument of type 'Report' could be found (are you missing a using directive or an assembly reference?).

То, что я делаю сейчас, я просто захожу в меню Build > Build Page и перестраиваю решение. Решение строится и работает. но это очень большая проблема, это отнимает много времени, есть сотни ссылок на этот класс, и каждый раз, когда я создаю решение, оно появляется, а затем работает решение для восстановления страницы.

Я использую Visual Studio 2017.

Редактировать Вот скриншот порядка сборки enter image description here

Я также проверил зависимости порядка сборки.

@TheGeneral он работает нормально, когда я захожу в меню Build > Build Page и снова создаю решение, все работает нормально

Umair Anwaar 26.10.2018 09:22

сначала создайте решение, затем на странице ошибок появляется ошибка. Страница сборки, а затем снова создайте решение. это моя работа сейчас, но это очень болезненно.

Umair Anwaar 26.10.2018 09:24
3
2
1 407
2

Ответы 2

Вместо использования глобального пространства имен вы должны назначить пространство имен своему классу, например, если ваше приложение называется «MyApplication», вы можете создать папку с именем «Reports», а затем создать свой класс в ней следующим образом:

namespace MyApplication.Reports
{
    public class Report
    {
        public string CheckIfReportAccess(string name)
        {
            //logic here
        }
    }    
}

Если вы хотите использовать его в коде своей страницы, вы должны иметь возможность сделать это, просто ссылаясь на пространство имен, как вы это делаете сейчас:

using MyApplication.Reports;
[...]
protected void Page_Load(object sender, EventArgs e)
{
    Report report = new Report();
    report.CheckIfReportAccess("SomeReport");
}

Если вы хотите сделать этот класс доступным для ваших представлений, у вас есть два варианта:

  1. Объявите его в своем Web.config, используя пространство имен:

    <pages> <namespaces> <add namespace="MyApplication.Reports"/> </namespaces> </pages>

Затем вы можете напрямую получить доступ ко всем классам в этом пространстве имен в своих представлениях:

<% Report report = new Report(); %>

<% if(report.CheckIfReportAccess("SomeReport") == "1") { %>
    <div>
        SomeReport has access
    </div>
<% } %>
  1. Импортируйте его прямо в ваше представление:

<%@ Import Namespace="MyApplication.Reports" %>

Редактировать

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

Редактировать 2

Если вы не можете изменить существующий класс из-за ограничений проекта (что я все равно считаю странным), вы всегда можете создать новый класс с пространством имен и именем, которое вы хотите, и унаследовать от проблемного класса:

namespace MyApplication.Reports
{
    public class MyReport : Report
    {
    }    
}

Затем используйте MyReport в своем представлении и не забудьте зарегистрировать пространство имен в своем Web.Config, как описано выше.

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

Umair Anwaar 02.11.2018 07:58

Мне не разрешено изменять имя класса, потому что он используется в нескольких приложениях, службах и интегрирован с 15+ системами. Итак, вопрос в том, почему я могу строить с использованием опции Build Page, если компилятор не строит решение для сборки.

Umair Anwaar 02.11.2018 13:06

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

Isma 02.11.2018 13:09

Извините за опоздание. Я прошу изменить пространство имен или имя класса, прежде чем загружать этот вопрос, и руководители проекта не позволяют мне внести эти изменения. Они говорят, что он работает без изменения имени класса или добавления нового пространства имен, если вы получаете ошибку при компиляции кода, просто войдите в меню и создайте эту страницу индивидуально. и сейчас я этим занимаюсь. Но это неправильный выбор, потому что сначала вы создаете и ждете 3 минуты, а затем появляется ошибка, затем страница сборки и снова проект сборки, это означает, что вам нужно как минимум 15 минут для запуска проекта.

Umair Anwaar 05.11.2018 09:10

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

Umair Anwaar 07.11.2018 10:12

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

Isma 07.11.2018 10:23

Судя по вашим комментариям к вопросу и подробному ответу @ Isma на ваш вопрос, похоже, что у вас может быть проблема с порядком сборки вашего проекта. Конкретно:

first build solution then error comes on error page Build page and then build solution again. its my work around now but its very painful.

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

Вы можете просмотреть и изменить порядок, в котором построены ваши проекты, следуя инструкциям в ответе на этот вопрос: Visual Studio 2010: как обеспечить соблюдение порядка сборки проектов в решении?

Вам нужно будет убедиться, что сборка, содержащая класс Report, указана в сборке раньше, чем все сборки, содержащие ссылки на этот класс.

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

Matt Shepherd 07.11.2018 03:24

Добавлен скриншот порядка сборки

Umair Anwaar 07.11.2018 10:27

Другие вопросы по теме