6

在我們的商店中,我們使用Cruise Control & MSBuild作爲持續集成的一部分來自動化產品的構建。獲取InternalsVisible當構建過程用強名稱標記程序集時工作?

構建的一部分是對組件進行簽名,使其具有強名稱。

在我們的項目文件中,當我們在本地開發時,它沒有指定簽名,因爲這被MSBuild腳本覆蓋。

這是一切順利,直到我決定我想介紹單元測試,需要我使用InternalsVisibleTo屬性。我也開始使用一個很好的開源庫,它有單元測試也使用這種技術。

這意味着,我的機器上,我可以更新AssemblyInfo.cs使用下面的語句:

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 

,一切都很好。

然而,在休息選中此構建因爲構建機簽署組件,該行需要被更新到這個樣子,而不是:

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, 
      PublicKey="magic key here..)"] 

我有點想不籤的組件並稱它爲一天。然而,「簽署程序集是一個最佳實踐」(重複這個咒語3次),如果我們從這樣做中獲得任何好處,我不想遠程它。

我們不會安裝到GAC,我們並不特別擔心篡改,不必擔心使用我們的庫的第三方,我們在更新應用程序時立即更新所有文件。最可識別的好處是支持的人不能將程序集的某些隨機版本複製到運行時文件夾中,並讓事情看起來能夠工作一段時間。

我不想打開所涉及的作品罐,並手動更改100個項目文件以啓用簽名。我也不想通過標記內部應該公開的東西來解決問題,我不希望進入綁定重定向&我不想刪除單元測試。

我希望所有的強名都沒有強名,並且有強名的好處(如果有的話),我不想創造大量額外的工作來完成它。那是過分的要求?

這篇文章描述的問題和解決好了,但我沒有太大的MSBuild的腳本傢伙趁它:

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/

什麼是解決這個問題的妥善解決?

歡迎提供任何意見和建議。

回答

4

在編譯之前,您可以將關鍵信息修補到源文件中。

以下示例使用MSBuild Community Tasks中的FileUpdate和(非常粗糙的)正則表達式將關鍵信息修補到C#AssemblyInfo.cs文件中。

<ItemGroup> 
    <AssemblyInfoFiles Include="$(MSBuildProjectDirectory)**/AssemblyInfo.cs"/> 
</ItemGroup> 
<FileUpdate 
    Files="@(AssemblyInfoFiles)" 
    Regex='(\[assembly:\s*InternalsVisibleTo\(\"[\w.]*\")(\)\])' 
    ReplacementText='$1, PublicKey="$(StrongNamingPublicKey)"$2' /> 

不過,我認爲修改項目始終強名稱的標誌將是消除開發和部署環境之間的一個更差的清潔解決方案,並可以很容易地編寫腳本。

+0

謝謝托馬斯,我會嘗試這一點,並會接受它作爲答案,一旦我得到它的工作。有一些問題需要強力在任何地方進行簽名,主要是因爲我不確定如何編寫腳本,我不想手動完成。我們現有的構建腳本,是由比我更熟悉MSBuild的人編寫的,我只是稍微調整一下,而不是引入重大變化。 – Wes

+0

我從來沒有這樣做過,但我會將其標記爲答案。 沒有用的東西是名爲AssemblyInfoFiles的ItemGroup ...它總是空的......任何想法爲什麼?包含模式基本上是你發佈的... 謝謝! – Wes

+1

上述ItemGroup假定要修補的AssemblyInfo.cs文件位於構建腳本下的目錄中; **通配符將匹配當前目錄下的任何目錄。有關MSBuild包含語法的更多信息,請參見[如何:選擇要構建的文件](http://msdn.microsoft.com/zh-cn/library/ms171454.aspx)。 –

5

使用您使用的相同構造來禁用簽名開發人員構建來定義編譯器符號,例如。 DO_NOT_SIGN,那麼,在你的AssemblyInfo.cs,使用此:

#if DO_NOT_SIGN 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 
#else 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, PublicKey="magic key here..)"] 
#endif 

我個人認爲它是不是從構建腳本修改源代碼更優雅。

+0

感謝您的回覆skolima。我想這個解決方案的問題是我現在不得不手動進入X#文件並創建這個構造,然而很多時候需要它,我或其他人必須記住要在新項目上做,並且有一些返工參與不太可能發生的事件,密鑰被改變。 它確實具有對任何人都是可見和可理解的好處,而不是在MSBuild腳本中埋沒的神祕感,這並非每個人都很瞭解。 我認爲我身邊的懶惰程序員會去做構建腳本,因爲腳本中已經有了它的框架。 – Wes

相關問題