MSBuild не работает, но сборка внутри Visual Studio работает нормально

C #, .NET 2.0

У меня есть веб-сайт ASP.NET в решении с двумя другими проектами (используются в качестве ссылок на библиотеки). Когда я создаю (отлаживаю или выпускаю) в Visual Studio, все работает нормально. Однако сборка с помощью MSBuild не выполняется.

Эта сборка была работала (на самом деле она вызывается через задачу nAnt). Единственное, что изменилось, это то, что у меня появился новый пользовательский элемент управления, на тип которого я ссылаюсь в своем коде.

Оскорбительный код находится в моем коде ASPX. MessageAlert - это UserControl:

MessageAlert userControl = this.LoadControl("~/UserControls/MessageAlert.ascx") as MessageAlert;
        userControl.UserMessage = message;
        this.UserMessages.Controls.Add(userControl);

Чтобы Visual Studio распознала тип MessageAlert, мне пришлось:

1) Установите ClassName = "MessageAlert" в разметке @Control в верхней части пользовательского элемента управления (поскольку использование автоматически сгенерированного UserControls_MessageAlert тоже не работало)

2) Зарегистрируйте пользовательский элемент управления в разметке моего ASPX, используя @Register

3) Добавьте "using ASP" в начало моего кода позади

После этих шагов я мог успешно ссылаться на тип MessageAlert в моем коде из Visual Studio. Но из MSBuild я получаю «Не удалось найти тип или имя пространства имен MessageAlert (вам не хватает директивы using или ссылки на сборку?)»

Выполнение MSBuild очень простое - он указывает на тот же самый файл решения и устанавливает для свойства конфигурации значение release.

Судя по количеству шагов, которые мне пришлось пройти, чтобы получить ссылки типа на MessageAlert в Visual Studio, кажется, что в процессе MSBuild чего-то не хватает. Но что? Фактически, Visual Studio не вызывает MSBuild за кулисами?

Есть ли лучший способ ссылаться на тип UserControl в коде ASPX?

РЕДАКТИРОВАТЬ: Чтобы уточнить, пользовательский элемент управления MessageAlert отсутствует в других сборках / проектах, на которые имеются ссылки. Я упомянул их, потому что вместе с веб-сайтом создается файл решения, который представляет собой тот же файл sln, который создается MS Build.


person Matt    schedule 19.05.2009    source источник
comment
Находится ли элемент управления messageAlert в одном из других упомянутых проектов? Обычно вы не можете этого сделать, но есть обходные пути.   -  person DancesWithBamboo    schedule 20.05.2009
comment
Вы используете это в проекте веб-сайта? Если так, то они на самом деле не предназначены для сборки как таковых. Это также может быть ответственным за UserControls_MessageAlert, который вы видели.   -  person John Saunders    schedule 20.05.2009


Ответы (3)


У меня тоже была эта проблема точно так же, как вы описали выше.

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

Измените имя класса пользовательского элемента управления - фактическое имя класса, а не имя класса в файле aspx.

поэтому в вашем примере измените имя класса на MessageAlert (из UserControls_MessageAlert), также измените это в наследовании в aspx

Надеюсь, это кому-то поможет

person Community    schedule 10.07.2009
comment
Спасибо за совет. Я все равно провел некоторый рефакторинг и решил эту проблему разными способами (больше не пытаясь использовать класс UserControls_ вне его внутреннего контекста), поэтому не могу проверить, устранило ли это проблему для меня. Но спасибо! - person Matt; 10.07.2009

Похоже, это проблема HintPath в вашем решении. Если вы добавляете сборки, на которые имеются ссылки, в проект как элементы связанного проекта (а также ссылки на проекты), MSBuild будет использовать связанные сборки вместо HintPath и даже AssemblyFolders.

Другой способ - добавить ключ с любым именем в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio_YourVersion_ \ AssemblyFolders и установить его (по умолчанию) значение типа REG_SZ в путь к вашим сборкам.

person zoidbeck    schedule 19.05.2009

Попробуйте удалить раздел «использование ASP» со своей страницы и убедитесь, что свойство «ClassName» директивы @Control действительно соответствует имени класса. У нас было значение ClassName, установленное на «FilterElement», в то время как фактическое имя класса было «Controls_FilterElement».

Итак, вкратце:

  • Проверьте имя вашего класса в .ascx.vb и свойство inherits директивы @Control в .ascx. например Inherits="FilterElement"
  • Добавьте свойство ClassName в директиву @Control с тем же значением, например ClassName="FilterElement"
  • На ссылающейся странице / элементе управления добавьте элемент «Ссылка». например

    <%@ Reference Control="~/Controls/FilterElement.ascx" %>

  • В приведенном ниже коде обратитесь непосредственно к классу. Не используйте пространство имен ASP (похоже, это является причиной затруднений с msbuild). например (в VB)

    Dim ctrlElement As FilterElement = CType(LoadControl("~/controls/filterelement.ascx"), FilterElement)

person Zarigani    schedule 08.05.2010