2011-11-04 43 views
3

我(成功)部署了一些sharepoint2010 - 使用msbuild的Webparts。一切正常,直到我決定改變assemblyVersion。每當我這樣做,消息Webpart「未註冊爲安全」更改AssemblyVersion後

Web Part Error: A Web Part or Web Form Control on this Page cannot be displayed or imported. The type RTContacts, RTContacts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2721ba85ef1e4b88 could not be found or it is not registered as safe.

一個解決辦法是留在1.0.0.0,但應該有一個更好的辦法...

也許有趣提的是,我們使用一個集中AssemblyFile其作爲鏈接包含在內。

清單包含正確的AssemblyVersion:

<Assemblies> 
<Assembly Location="RTContacts.dll" DeploymentTarget="GlobalAssemblyCache"> 
    <SafeControls> 
    <SafeControl Assembly="RTContacts, Version=1.0.4325.18399, Culture=neutral, PublicKeyToken=2721ba85ef1e4b88" Namespace="RTContacts" TypeName="*" /> 
    </SafeControls> 
</Assembly> 

當我再次添加的WebPart到該網站,它被正確顯示出來,但已經存在的webpart似乎鏈接到舊版本。

回答

5

您遇到這些問題是因爲您錯誤地使用版本控制屬性。

如果您在Reflector中檢查Microsoft.SharePoint.dll,則會看到v14.0.0.0(適用於SharePoint 2010)。

的AssemblyVersion將保持完全相同的測試版,RCX,RTM所有服務包和聯通等 - 唯一改變的事情是的AssemblyFileVersion(這是您在Windows資源管理器中看到下性質的東西)

更多細節

SharePoint features: How can I use wildcard assembly versioning?

看到這個但是,不要把我的話 - 微軟KB556041 - How to use Assembly Version and Assembly File Version

如果你遵循這個,那麼不需要大會綁定重定向,當你更新你的web部件時,現有的實例不會被打破。

+0

我們決定做一個「髒」的解決方案。將AssemblyVersion保留在1.0.0.0上並使用AssemblyTitle保存「我們的」版本號。結合顯示所有webparts的AssemblyTitle的webpart,這對我們來說是一個骯髒但卻很有效的解決方案。 –

+1

從「髒」到正確只有一小步 - 將AssemblyVersion設置爲1,並將版本信息放在AssemblyFileVersion中。您甚至可以在Web部件上輸出AssemblyFileVersion信息(我將它放在工具部件中以便於排除故障)。任務完成。 – Ryan

+1

它已經有一段時間了。只是想告訴你我們在一段時間後做了乾淨的解決方案:) –

2

原始問題:如何修改程序集版本更改後的「未註冊爲安全」錯誤?

Web部件已在web.config文件中註冊爲安全文件。

適當的條目是這樣的:

<SafeControl Assembly="MyWebPartLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
    Namespace="MyWebPartLibrary" 
    TypeName="*" 
    Safe="True" 
    AllowRemoteDesigner="True"/> 

修改Assembly屬性,並用新的替換舊的版本號。

當前問題:如何在不必將所有Web部件重新添加到頁面的情況下更改部件版本?

我認爲你需要使用集重定向,以保持現有的Web部件實例工作:

<runtime> 
    <assemblyBinding> 
    <dependentAssembly> 
     <assemblyIdentity name="RTContacts" publicKeyToken="2721ba85ef1e4b88" culture="neutral" /> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="1.0.4325.18399" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

閱讀文章Web Part Versioning with assembly redirection對這個問題的詳細分析。

+0

GAC,manifest和web.config都一樣正確,但重啓沒有幫助 –

+0

呵呵。我剛剛發現該消息表示無法找到V 1.0.0.0。對不起,我沒有提及它,但那些信息隱藏在另一層之後。 –

+0

我剛剛更新了說明:已經在我的頁面上的Webparts會引發錯誤。如果我在該頁面上再次添加相同的Web部件,它可以正常工作。每次部署新版本時重新添加所有Web部件將會有些尷尬,因爲項目中已有大約10萬個頁面。另外我絕對相信我們的webparts中沒有任何硬編碼版本。我完全是自己寫的,沒有什麼魔法 –