Dynamics 365执行Remove Active Customizations的多种方法

宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述Dynamics 365执行Remove Active Customizations的多种方法相关的知识,希望能为你提供帮助。
我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复423或者20201009可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
非托管层(Unmanaged Layer) 在你使用托管解决方案(Managed Solution)的时候挺烦的,一般是在目标环境手动修改某些组件而产生,产生后它一直会居于Solution Layer的最上层,会遮住Managed Solution导入而产生的Solution Layer,这样看起来就是Managed Solution导入后没有效果。一般我们是需要删除掉非托管层(Unmanaged Layer) 的,有多种方法,请听我说道来。
最常见的是在界面上操作的方法。查看组件的Solution Layers方法如下,打开某个Solution,选择某个组件,然后点击【Solution Layers】按钮。

Dynamics 365执行Remove Active Customizations的多种方法

文章图片


如果出来的界面显示有一个Solution名称为Active的Solution Layer,这个Solution Layer就是Unmanaged Layer。因为它的Order总是最大的,会覆盖下面的Solution Layer,会导致导入的Managed Solution没有效果。
Dynamics 365执行Remove Active Customizations的多种方法

文章图片


删除它也很简单,点击【Active】旁边的 【...】符号,点击出来【Remove Active Customizations】进行删除即可。
Dynamics 365执行Remove Active Customizations的多种方法

文章图片


你应该会想,一个个看,删除太慢太麻烦了,有批量处理工具吗?有的,XrmToolBox中有个工具叫做 Solution Layer Removal 可以批量查看和移除。
Dynamics 365执行Remove Active Customizations的多种方法

文章图片


操作也比较简单,点击【Load Solutions】按钮,然后选择某个Solution,再点击【Load Unmanaged Components】就会列出该Solution中所有含有Unmanaged Layers的组件。
选中要移除Unmanaged Layer的组件,点击【Remove Active Customizations】按钮进行移除即可。
Dynamics 365执行Remove Active Customizations的多种方法

文章图片


有时候还会用到特殊的方法来Remove Active Customizations,这就是 RemoveActiveCustomizations Function,这个函数包括两个输入参数,第一个输入参数SolutionComponentName,官方文档有说明它是string类型,并没有讲有哪些值,我这里列表如下,第二个参数ComponentId这个容易猜出来,就是要移除的组件的id,一般在解决方案中双击某个组件而弹出的窗口中就会有这个id的值。
SolutionComponentName说明
AppModule
AttributePicklistValue
LocalizedLabel
OptionSet
PluginAssembly
PluginType
SdkMessageProcessingStep
SiteMap
SystemForm
WebResource
Workflow
SavedQuery
Custom Connectors
FieldSecurityProfile
FieldPermission
Field (attribute)除了这些类型都支持: image, file, customer, owner, virtual, partylist, calendarrules, rollup / calculated
Role
RolePrivileges
Relationships
Entity暂不支持,实际上Entity上的非托管层没有关系
AIModel开发中
AIConfiguration开发中
Custom Components

值得说明的是,如果你要处理的对象是仪表盘(Dashboard),则使用SystemForm作为SolutionComponentName参数的值。
那怎么使用呢?很简单。我在解决方案中双击某个Role,打开的窗口的URL类似 https://luoyongdemo.crm.dynamics.com/biz/roles/edit.aspx?appSolutionId=%7b02A296F0-BB49-4A19-9D1B-A0746319B0DB%7d& id=%7b758F55FB-9D8E-EA11-A811-000D3A33BE69%7d& _CreateFromType=7100& _CreateFromId=%7b02A296F0-BB49-4A19-9D1B-A0746319B0DB%7d
从这个url中可以知道这个Role的id是758F55FB-9D8E-EA11-A811-000D3A33BE69,要删除安全角色的Active Customizations,第一个参数SolutionComponentName需要传递Role,然后直接用浏览器发起如下请求:
https://luoyongdemo.crm.dynamics.com/api/data/v9.1/RemoveActiveCustomizations(SolutionComponentName=\'Role\',ComponentId=758F55FB-9D8E-EA11-A811-000D3A33BE69)
如果成功则结果类似如下:
Dynamics 365执行Remove Active Customizations的多种方法

文章图片



还有可能会碰到命令栏上的按钮部署后没有效果,在url的最后加上 & ribbondebug=true ,然后点击命令栏因为url增加这部分而出现的 Command Checker 按钮的下面部分看下layer的情况:
Dynamics 365执行Remove Active Customizations的多种方法

文章图片



有时候可能会看到Enable Rule或者Display Rule上有非托管层,这个非托管层也会优先起作用,覆盖托管层,从而导致托管层没有生效。可以选择两个层进行比较,看有什么变化,比如这里就是Active 层(也就是非托管层)和某个托管层比较的样子。
Dynamics 365执行Remove Active Customizations的多种方法

文章图片



那这种非托管层如何去掉呢?我从Microsoft CSS处得到了一种方法。就是将这个实体的元数据用非托管解决方案导出,解压开,编辑解压后的 customizations.xml 文件,将其中的 RibbonDiffXml 元素的值替换成如下值,然后将文件打包成Zip文件,导入到Dynamics 365中发布就可以会删除这种Enable Rule或者Dispaly Rule的非托管层。
< RibbonDiffXml> < CustomActions /> < Templates> < RibbonTemplates Id="Mscrm.Templates"/> < /Templates> < CommandDefinitions /> < RuleDefinitions> < TabDisplayRules /> < DisplayRules /> < EnableRules /> < /RuleDefinitions> < LocLabels /> < /RibbonDiffXml>



【Dynamics 365执行Remove Active Customizations的多种方法】


    推荐阅读