Класс Build Solution Error не содержит определения для xxx, если определение существует и страница сборки работает - PullRequest
0 голосов
/ 26 октября 2018

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

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.
}

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

ОШИБКА: «Отчет» не содержит определения для «CheckIfReportAccess», и невозможно найти метод расширения «CheckIfReportAccess», принимающий первый аргумент типа «Отчет» (вы пропустили директиву using или ссылка на сборку?).

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

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

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

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

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

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

0 голосов
/ 31 октября 2018

Вместо того, чтобы использовать глобальное пространство имен, вы должны назначить пространство имен вашему классу, например, если ваше приложение называется «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>
<% } %>
Импортируйте его прямо в вашем представлении:

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...