MSBuild не работает, но сборка внутри Visual Studio работает нормально - PullRequest
2 голосов
/ 20 мая 2009

C #, .NET 2.0

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

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

Код ошибки в моем ASPX-коде. MessageAlert - это пользовательский контроль:

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) Добавьте «использование ASP» в начало моего кода позади

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 10 июля 2009

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

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

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

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

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

0 голосов
/ 08 мая 2010

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

Итак, в итоге:

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

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

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

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

0 голосов
/ 20 мая 2009

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

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

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