2008年4月29日,星期二

在页面布局中引用程序集时的注意事项

这是上周在办公室里提出的,我认为值得讨论。在我们拥有的一个项目中,页面布局使用ASP.Net Register指令引用包含我们的控件的程序集。所以我们在代码中有几个指令类似于:

<%@ Register TagPrefix="psw" Namespace="OurCompany.OurClient.SharePoint.WebControls" Assembly="Parity.SharePoint.WebControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=00000000000000" %>


这些目的是为了告知页面布局有关控件组件的信息,并确保设计人员可以为我们提供控件及其成员的Intellisense。


然后出现的问题是"当我们更新共享程序集并想要增加版本号时会发生什么?当然,我们不必更新和重新发布所有页面布局吗?"有两个答案:



  • 我们 可以 在应用程序配置中使用程序集重定向以避免更改页面布局。然后,这些条目将告诉.Net每当请求版本1.0.0.0时就加载(例如)程序集的版本2.0.0.0。这会起作用,但是这意味着在后续程序集版本中添加的任何新成员/更改成员,我们都不会获得Intellisense。

  • 我们也可以避免以这种方式完全引用通用程序集,而将引用集中在web.config中


因此,而不是在每个页面布局中都有一个条目,web.config的“页面”部分(在.Net 2.0及更高版本中)使我们可以在一个中央位置引用包含控件的程序集,这意味着对程序集名称的任何更改都易于实现。实行:



<pages>
<controls>
<add tagPrefix="psw" namespace="OurCompany.OurClient.SharePoint.WebControls"
assembly="OurCompany.OurClient.SharePoint.WebControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=00000000000000" />
<!-- also works with short assembly name -->
<!--
<add tagPrefix="psw" namespace="OurCompany.OurClient.SharePoint.WebControls"
assembly="OurCompany.OurClient.SharePoint.WebControls" />
-->
</controls>
</pages>


[旁注]-正如我在注释中指定的那样,可以用短名称引用程序集,但是具有定义版本控制策略的商店将希望避免这种情况,因为那样就不可能具有并行版本的程序集,这是.Net引入的基本前进步骤之一。


然而,这还不是全部。 不幸的是,SPD不够灵巧,无法解析web.config中的程序集引用来提供Intellisense。 我最初以为是,但是but关闭并重新打开表明,实际上已经缓存了某些内容。 视觉工作室 具有足够的意识(如果我们处于纯.Net场景中),但没有SPD。


因此,就我所知,这是一个折衷方案-在页面布局中使用@Register指令(在其中带有版本号),或者在web.config中引用但失去Intellisense。


我想知道是否可以在@Register指令中使用简短的程序集名称,但是在web.config中提供了一个四部分的程序集名称,以便在运行时使用。不幸的是,这是行不通的,因为.Net将其视为模棱两可的注册。因此,如果您希望将程序集版本号保留在页面布局之外,而又保留Intellisense,则一种策略可能是在发布过程中删除@Register指令。


还是作为替代性的最终想法-更重要的是,开发过程中的Intellisense或在发布时将问题最小化?为了我的钱,在SPD中丢失Intellisense给控件带来的不便是一个小麻烦,因此在web.config中引用程序集是一种更好的方法。

3条评论:

匿名 said...

是的,由于MOSS的Telerik RadEditor,我得出了同样的结论。当他们发布新版本时,它们会增加。他们的文档说要把参考放在页面上。

猜猜您在设计时是否需要智能,可以暂时放置Register标签。但这有漏洞。

顺便说一句-您有一些杀手posts。我又回到了您的话题上,您的CT as Feature帖子是我有史以来最喜欢的内容之一(令人讨厌的笑容...)

-丰富

未知说过...

如果要更改的程序集在GAC中,您是否尝试过使用发布者策略(即,在GAC中仅包含重定向信息的DLL)?
这对于使用DLL的所有应用程序都应该有效,也可能适用于在处理SPD请求的服务器上运行的代码。我不确定,因为我没有尝试过。
-让·玛丽

克里斯·奥'Brien说过...

@Timores,

发布者策略是应用程序配置中程序集绑定重定向(即版本重定向)的替代方法,但 不是 指令的替代品,该指令实际上将页面/应用程序与程序集链接在一起。因此,您仍然需要使用本文讨论的方法之一。

就使用发布者策略覆盖运行时加载的程序集而言,我主要将其视为仅用于打包软件供应商的工具。该技术基本上提供了程序集重定向,而无需要求管理员正确地手动修改其web.config-因此,对于供应商而言,它看起来更加专业,并且可能导致更少的支持呼叫。但是我猜想,如果您不得不为了重新编译指令而不得不重新编译(通过简单地修改配置文件),那在其他情况下也可以工作。有趣的想法。

干杯,

C。