我正在嘗試篡改組件,以便能夠模擬不容易被嘲笑的代碼,such as SharePoint assemblies。如何忽略單元測試中的程序集引用不匹配?
作爲一個原型,我有一個解決方案,通過ILRepack和Mono.Cecil的自定義構建動作來篡改測試代碼,以便實際代碼不是原來編寫的代碼。
當包含測試代碼的程序集未簽名時,一切正常。當組件簽字,我看到好預期的錯誤:
The located assembly's manifest definition does not match the assembly reference.
由於裝配被篡改,顯然,密鑰是不一樣的(如果被篡改後簽署),或不存在。
我認爲通過AppDomain.CurrentDomain.AssemblyResolve
事件可能允許強制篡改的程序集被接受,但事實並非如此。
如何在完全信任的單元測試期間,如何讓.NET Framework忽略對程序集匹配的檢查,並在接受未簽名的程序集時接受它們?
據我所知,問題不在於強名稱驗證。不僅錯誤會有所不同,而且running the corresponding sn –Vr
也不起作用:錯誤仍然存在。
實際問題似乎是在程序集綁定級別。這也是爲什麼我驚訝地看到AppDomain.CurrentDomain.AssemblyResolve
事件被提出,但其結果仍然被忽略;可能,它不會做我一直認爲它做的事。
我不確定自己是否正確理解,但這聽起來像是在試圖擊敗您編寫的安全代碼。即如果你知道如何通過單元測試來勝過你的代碼,那麼這並不意味着黑客可以使用相同的方法來打敗你的生產防禦。 –
@PaulSasik:正好。在生產中,黑客確實可以使用相同的技術,但它適用於以完全信任方式運行的代碼。除此之外,我希望單元測試的具體環境也可能有所幫助:例如,在執行代碼覆蓋或分析時使用的機制不同; –
http:// stackoverflow。com/a/3268952似乎提到了能夠使用'sn -T'的地方,其中'fullname'是'Assembly = MyAssembly.dll,公鑰標記= '。也許你可以在修改程序集後設置它? –
Eris