2017-08-26 86 views
-1

我偶然發現了一個合作項目,其中一部分引用了我的接口庫併爲我們的工具部署了一個自編譯的MEF插件。我知道這些人正在使用哪些方法,並且我希望在構建過程中監視我們的庫,如果方法簽名已更改(只是爲了確保沒有人檢查過東西,這應該導致另一個接口版本並損害插件承載能力)。c#在構建過程中監視關鍵方法簽名的變化

實際上,我有一個控制檯項目,記錄中的簽名以某種方式硬編碼並通過反射進行檢查 - 但也許有更優雅或更簡單的方法。

任何提示都會很棒。

在此先感謝!

回答

0

Roslyn 2.3引入了generating reference assemblies的功能。這是一個只包含公共類型和成員的程序集。當與"deterministic" feature(=>可重複生成的版本)一起使用時,只要未對公共接口進行任何更改(實施更改和私有/內部成員無關緊要),生成的引用程序集就會保持二進制相同。

所以,你可以添加到您的csproj:

<PropertyGroup> 
    <Deterministic>true</Deterministic> 
    <ProduceReferenceAssembly>true</ProduceReferenceAssembly> 
</PropertyGroup> 

直到VS 2017年15.5出來的時候,我建議增加<CompileUsingReferenceAssemblies>false</CompileUsingReferenceAssemblies>到所有消費項目,因爲IDE(如「去定義」)有一些問題此功能除非您正在使用用於.NET Core和.NET Standard項目的「新項目系統」。 (如果公共接口發生變化,那麼只有在重新構建引用該項目的項目時纔會重新構建這些項目 - 這隻會在實施發生變化時加速大型解決方案的增量構建。

這些更改將在您的輸出中創建一個ref文件夾。然後你可以檢查那裏的裝配的校驗和是否與每個裝配上的已知的Cheksum相匹配。

+0

啊,還行,就是整個裝配一個有趣的方法。不幸的是,只有一個interface.dll有數百種類型 - 確定性的引用程序集選項會在每次添加其他接口時重新生成一個帶有新校驗和的程序集,不是嗎? – Monga

+0

是的,這是真的。在這種情況下,這個選項不適合你。儘管如此,如果它能幫助某人,我會留下答案 –

0

我最終創建了一個帶有try catch塊的小型控制檯應用程序,使用與項目合作伙伴相同的接口dll和相同的對象 - 使用上次發佈的接口庫進行編譯。在執行期間,如果簽名變得無效(由普通的.NET進程發現),它將落入catch分支 - 然後退出代碼將以-1引發。

在後期構建過程中執行所有這些操作,如退出代碼this article所示,並自動分解構建。

不是很高興與解決方案,但得到它的工作...進一步的想法還是想:-)