MSBuild失败,但在Visual Studio中构建正常

3

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)在用户控件顶部的@Control标记中设置ClassName="MessageAlert"(因为使用自动生成的UserControls_MessageAlert也不起作用)
2)在我的ASPX的标记中注册用户控件,使用@Register 3)在我的代码后面添加"using ASP"
经过这些步骤,我可以成功地从Visual Studio的代码后台引用MessageAlert类型。但是从MSBuild中,我得到了"The type or namespace name 'MessageAlert' could not be found (are you missing a using directive or an assembly reference?)"。
MSBuild执行非常简单-它指向完全相同的解决方案文件,并将配置属性设置为发布。
基于我必须经历的步骤数量来获取Visual Studio中对MessageAlert的类型引用,似乎在MSBuild过程中缺少了某些东西。但是什么呢?实际上,Visual Studio是否在幕后调用MSBuild?
有没有更好的方法在ASPX的代码后台引用UserControl类型?
编辑:为了澄清,MessageAlert用户控件不在其他已引用的程序集/项目中。我提到它们是因为它们与网站一起组成了解决方案文件,该文件与MS Build构建的相同sln文件。

消息提示控件是否在“其他”引用项目中?通常情况下是不允许的,但有一些解决方法。 - DancesWithBamboo
你是在一个网站“项目”中使用这个吗?如果是的话,它们并不是真正意义上的构建。这也可能是你看到的“UserControls_MessageAlert”的原因。 - John Saunders
3个回答

3

我之前也遇到了你描述的这个问题。

我一度不知道原因何在,最终尝试以下方法成功解决。

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

所以,在您的示例中,将类名更改为MessageAlert(从UserControls_MessageAlert),并在aspx中的继承中也进行相应更改。

希望这能帮助到某些人。


谢谢你的建议。最后我还是进行了一些重构,并通过其他方式解决了这个问题(不再试图在UserControls_类的内部上下文之外使用它),所以无法验证这是否会解决我的问题。但还是谢谢! - Matt

0
尝试从页面中删除 "using ASP" 部分,并确保@Control指令的 "ClassName" 属性实际匹配类名。我们将 ClassName 值设置为 "FilterElement",而实际类名是 "Controls_FilterElement"。
因此,总之:
  • 在 .ascx.vb 和 @Control 指令的 inherits 属性中验证类名,例如: Inherits="FilterElement"
  • 使用相同的值添加 "ClassName" 属性到 @Control 指令中,例如: ClassName="FilterElement"
  • 在引用页面/控件上添加 "Reference" 元素,例如:

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

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

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


0
这似乎是您解决方案中 HintPath 问题。如果您将引用的程序集作为链接项目项添加到项目中(以及项目引用),MSBuild 将优先使用链接程序集,而不是 HintPath 甚至 AssemblyFolders。
另一种方法是在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio_YourVersion_\AssemblyFolders 中添加任何名称的键,并将其(默认)REG_SZ 类型值设置为包含您程序集的路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接