背景
最近正在研發一款Revit插件,爲加強dll間引用的關聯性,對發佈的所有dll進行了強簽名。
在Revit加載強命名的插件後,執行插件命令,程序拋出異常未能加載文件或程序集或它的某一個依賴項。需要強名稱程序集。
問題原因
強命名程序集的引用規則
假設一個項目的dll通過以下的方式進行引用
其中dll B是強命名的程序集,則被它引用的D/E/F
都需要是強命名程序集。而引用B的項目A不需要強命名。
RevitAPI
查看了一下插件項目的引用,發現RevitAPI.dll和RevitAPIUI.dll都是弱命名程序集,因此插件本身不能進行強命名。
官方解析
有兩篇文章說到Revit或AutoCAD插件無法進行強命名
1. Revit API: Not Strong Named (cont.)
2. No Inheritance and No Strong Naming
3. Can I sign my AutoCAD .NET plug-in with a strong name
大致原因是
- 強命名會導致插件補丁工作更復雜
- 強命名程序集需要放到GAC裏纔可以避免命名檢查的性能損耗
- AutoCAD2015的插件曾經支持強命名,但考慮到太複雜,在後續的版本被移除了
當然還有解決方案(基於安全方面的考慮)
- 只信任部分網絡
- 認證爲Autodesk開發者並認證你的插件應用。