使用ILMerge合并CRM插件与SharePoint Online程序集遇安全异常
兄弟,我之前做CRM插件合并SharePoint程序集的时候也踩过一模一样的坑!明明反编译能看到类,ClientContext也能正常实例化,一到new SharePointCredentials()就炸安全异常,大概率是合并过程中权限元数据丢失或者强名称验证出问题了,给你几个我亲测有效的解决思路:
1. 用ILMerge参数强制保留权限元数据和强名称
ILMerge默认不会完整保留原程序集的安全属性,尤其是像SharePoint这类带强命名的程序集,合并时权限特性很容易被丢掉。你需要在合并命令里加上这几个关键参数:
/keyfile:指定你的CRM插件的强名称密钥文件,确保合并后的程序集重新签名,避免强名称验证失败/copyattrs:复制原程序集的所有属性(包括权限相关的特性)/target:library:因为插件是类库,指定合并后的输出类型为类库
完整命令示例:
ilmerge /target:library /out:YourMergedPlugin.dll YourCrmPlugin.dll Microsoft.SharePoint.Client.dll Microsoft.SharePoint.Client.Runtime.dll /keyfile:YourStrongNameKey.snk /copyattrs
2. 检查SharePointCredentials的权限特性是否丢失
用JustDecompile打开合并后的DLL,找到SharePointCredentials类,看看它是否保留了原程序集中的权限特性(比如[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]这类)。如果特性丢了,说明ILMerge没正确复制元数据,这时候要么调整参数,要么换工具。
3. 换用ILRepack替代ILMerge
ILMerge对复杂程序集的兼容性确实一般,ILRepack是个更现代的合并工具,对.NET程序集的权限元数据和强名称处理更友好。试试用它来合并:
ILRepack /out:YourMergedPlugin.dll /keyfile:YourStrongNameKey.snk YourCrmPlugin.dll Microsoft.SharePoint.Client.dll Microsoft.SharePoint.Client.Runtime.dll
4. 放弃合并,改用依赖部署
如果合并的方式始终绕不开权限问题,不如换个思路:不要合并SharePoint的两个程序集,而是把Microsoft.SharePoint.Client.dll和Microsoft.SharePoint.Client.Runtime.dll一起部署到CRM服务器的插件目录(或者GAC),让CRM插件运行时直接加载依赖程序集,这样能彻底避免合并带来的权限冲突。
最后提醒下:调试时一定要看异常的完整堆栈信息,里面会明确指出缺少哪种权限,能帮你更快定位问题!
内容的提问来源于stack exchange,提问作者creatiive

