以编程方式将插件程序集上传到 MS CRM Online
Uploading plugin assembly to MS CRM Online programmatically
我正在尝试使用我的自定义应用程序将包含 CRM 插件的新版本插件程序集上传到 MS CRM Online 实例,而不是 PluginRegistrationTool
。
方法非常简单:
var plugin = new Entity("pluginassembly")
{
Id = PluginId // correct GUID of the plugin assembly stored in CRM
};
plugin["content"] = Convert.ToBase64String(ReadBinaryFile(filename));
Service.Update(plugin);
当我使用本地 CRM 进行测试时,代码运行良好。但是,当我Service
在线指向MS CRM时,结果不成功。
程序集已上传,但当我尝试执行分配给它的步骤时,CRM 触发 SecurityException
:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: System.Security.SecurityException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #E824CF49Detail:
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
<ErrorCode>-2147220970</ErrorCode>
<ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
<Message>System.Security.SecurityException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #E824CF49</Message>
<Timestamp>2015-06-24T07:57:27.5491666Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText>
</TraceText>
</OrganizationServiceFault>
我可以理解,CRM Online 可能会执行额外的检查。但我不明白它到底检查了什么,以及为什么用 PluginRegistrationTool
上传的程序集通过了这个检查,而直接上传——检查失败。
有没有人遇到过这样的问题?也许有人可以在没有逆向工程的情况下帮助回答 PluginRegistrationTool
?
提前感谢您提供任何线索。
@HenkvanBoeijen 的评论给了我一个线索,这实际上很有帮助。
我的插件使用外部库,并且使用ILMerge
工具将它们与主要代码打包在一起。但。这是合并过程中的错误。结果文件被我的代码捕获 BEFORE 它由 ILMerge
签名。因此,文件本身没问题,但由于它没有用强名称签名,它在 Isolated
模式下失败,在 Normal
模式下正常。
所以解决方案是不要着急,让 ILMerge
完成它的工作。之后一切正常。
我正在尝试使用我的自定义应用程序将包含 CRM 插件的新版本插件程序集上传到 MS CRM Online 实例,而不是 PluginRegistrationTool
。
方法非常简单:
var plugin = new Entity("pluginassembly")
{
Id = PluginId // correct GUID of the plugin assembly stored in CRM
};
plugin["content"] = Convert.ToBase64String(ReadBinaryFile(filename));
Service.Update(plugin);
当我使用本地 CRM 进行测试时,代码运行良好。但是,当我Service
在线指向MS CRM时,结果不成功。
程序集已上传,但当我尝试执行分配给它的步骤时,CRM 触发 SecurityException
:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: System.Security.SecurityException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #E824CF49Detail:
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
<ErrorCode>-2147220970</ErrorCode>
<ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
<Message>System.Security.SecurityException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #E824CF49</Message>
<Timestamp>2015-06-24T07:57:27.5491666Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText>
</TraceText>
</OrganizationServiceFault>
我可以理解,CRM Online 可能会执行额外的检查。但我不明白它到底检查了什么,以及为什么用 PluginRegistrationTool
上传的程序集通过了这个检查,而直接上传——检查失败。
有没有人遇到过这样的问题?也许有人可以在没有逆向工程的情况下帮助回答 PluginRegistrationTool
?
提前感谢您提供任何线索。
@HenkvanBoeijen 的评论给了我一个线索,这实际上很有帮助。
我的插件使用外部库,并且使用ILMerge
工具将它们与主要代码打包在一起。但。这是合并过程中的错误。结果文件被我的代码捕获 BEFORE 它由 ILMerge
签名。因此,文件本身没问题,但由于它没有用强名称签名,它在 Isolated
模式下失败,在 Normal
模式下正常。
所以解决方案是不要着急,让 ILMerge
完成它的工作。之后一切正常。