MSBuild失败,但在Visual Studio内构建工作正常

时间:2009-05-19 22:27:32

标签: .net asp.net msbuild

C#,. NET 2.0

我在一个解决方案中有一个ASP.NET网站,还有另外两个项目(用作库引用)。当我在Visual Studio中构建(调试或发布)时,一切正常。但是,使用MSBuild构建失败。

此构建正在运行(实际上是通过nAnt任务调用的)。唯一改变的是我有一个新的用户控件,其类型I在我的代码后面引用。

违规代码在我的ASPX代码中。 MessageAlert是UserControl:

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

为了让Visual Studio能够识别“MessageAlert”类型,我必须:

1)在用户控件顶部的@Control标记中设置ClassName =“MessageAlert”(因为使用自动生成的UserControls_MessageAlert也不起作用)

2)使用@Register

在我的ASPX的标记中注册用户控件

3)在我的代码顶部添加“使用ASP”

在这些步骤之后,我可以从visual studio成功引用我的代码隐藏中的MessageAlert类型。但是从MSBuild我得到“无法找到类型或命名空间名称'MessageAlert'(你是否缺少using指令或程序集引用?)”

MSBuild执行非常简单 - 它指向完全相同的解决方案文件并将配置属性设置为release。

根据我在Visual Studio中获取对MessageAlert的类型引用所需的步骤,似乎MSBuild进程中缺少某些内容。但是什么?事实上,Visual Studio是否在幕后调用MSBuild?

有没有更好的方法在ASPX背后的代码中引用UserControl类型?

编辑:为了澄清,MessageAlert用户控件在其他引用的程序集/项目中。我之所以提到它们是因为,与网站一起,编写解决方案文件,这是由MS Build构建的同一个sln文件。

3 个答案:

答案 0 :(得分:2)

我也完全按照你的描述解决了这个问题。

我不知道为什么会这样,作为最后的结果,我决定尝试以下成功。

更改用户控件的类名 - 实际的类名而不是aspx文件中的类名。

所以在您的示例中将类名更改为MessageAlert(来自UserControls_MessageAlert)也会在aspx中继承更改此内容

希望这有助于某人

答案 1 :(得分:0)

这似乎是您的解决方案中的HintPath问题。如果将引用的程序集作为链接的项目项(以及项目引用)添加到项目中,MSBuild将使用链接的程序集优先于HintPath甚至AssemblyFolders。

另一种方法是将具有任何名称的密钥添加到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio_YourVersion_ \ AssemblyFolders,并将其类型为REG_SZ的(默认)值设置为包含程序集的路径。

答案 2 :(得分:0)

尝试从页面中删除“使用ASP”部分,并确保@Control指令的“ClassName”属性实际上与该类的名称匹配。我们将ClassName值设置为“FilterElement”,而实际的类名称为“Controls_FilterElement”。

所以,总结一下:

  • 验证.ascx.vb中的类名和.ascx上@Control指令的inherits属性。例如Inherits="FilterElement"
  • 将“ClassName”属性添加到具有相同值的@Control指令,例如ClassName="FilterElement"
  • 在引用页面/控件上添加“Reference”元素。 e.g。

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

  • 在后面的代码中,直接引用该类。 不要使用ASP命名空间(这似乎是造成msbuild困难的原因)。例如(在VB中)

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