这是上周在办公室里提出的,我认为值得讨论。在我们拥有的一个项目中,页面布局使用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中引用程序集是一种更好的方法。