2009-05-19 76 views
2

C#,.NET 2.0MSBuild失败,但建设里面的Visual Studio工作正常

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

这个版本一直在工作(它实际上是通过一个nAnt任务调用的)。唯一改变的是我有一个新的用户控件,其Type I在我的代码中引用。

违规代码在我的ASPX代码后面。 MessageAlert是用户控件:

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

为了让Visual Studio来识别型“MessageAlert”我必须:在@Control标记

1)设定该类=“MessageAlert”顶部用户控制的(因为使用自动生成的UserControls_MessageAlert没有任何工作)

2)注册在我的ASPX的标记用户控件,使用@Register

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

经过这些步骤之后,我可以在Visual Studio的代码隐藏中成功引用MessageAlert类型。但是从MSBuild中我得到“无法找到类型或名称空间名称'MessageAlert'(您是否遗漏了使用指令或程序集引用?)”

MSBuild的执行非常简单 - 它指出了非常类似的解决方案文件并将配置属性设置为释放。

看来,根据我在Visual Studio中获得MessageAlert类型引用所经历的步骤数量,MSBuild过程中缺少某些内容。但是什么? Visual Studio实际上不是在幕后调用MSBuild?

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

编辑:为了澄清,MessageAlert用户控件是而不是在其他引用程序集/项目。我提到他们是因为和网站一起组成了Solution文件,这个文件和MS Build一样是由同一个sln文件构成的。

+0

是在 “其他” 引用的项目之一messageAlert控制?你通常不能这样做,但有解决方法。 – DancesWithBamboo 2009-05-19 23:51:27

+0

你在一个网站“项目”中使用这个吗?如果是这样,他们本身并不是真正意义上的*构建*。这也可能是你所看到的“UserControls_MessageAlert”的原因。 – 2009-05-20 01:27:55

回答

0

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

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

2

我也有这个问题,正如你上面所描述的。

我不知道为什么这是最终目标,决定尝试以下成功。

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

所以在你的榜样更改类名来MessageAlert(从UserControls_MessageAlert)在ASPX也改变这一在继承

希望这可以帮助别人

0

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

因此,简言之:

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

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

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

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

相关问题