首页 > 解决方案 > Microsoft.CrmSdk.XrmTooling.CoreAssembly 与 Targetframework .NET 4.5.2 在 CrmServiceClient.Execute 上导致 NullReference 异常

问题描述

我们在面向 .NET 4.5.2 的普通控制台应用程序中使用以下代码连接到 Dynamics 365 CRM。

 private static void Main(string[] args)
    {
        RetrieveAllEntitiesRequest req2 = new RetrieveAllEntitiesRequest();
        req2.EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.Entity;

        CrmServiceClient conn = new CrmServiceClient(
            "svccrm@contoso.com",
            CrmServiceClient.MakeSecureString("secret"),
            "EMEA", "contoso",
            useUniqueInstance: true,
            useSsl: true, isOffice365: true);

        try
        {
            //error with target framework 4.5.2
            var resp2 = conn.Execute(req2) as RetrieveAllEntitiesResponse;
        }
        catch
        {
            string lastError = conn.LastCrmError;
        }
    }

以下 nuget 包位于 packages.config 中

<package id="Microsoft.CrmSdk.CoreAssemblies" version="9.0.2.5" targetFramework="net452" />
<package id="Microsoft.CrmSdk.Deployment" version="9.0.2.4" targetFramework="net452" />
<package id="Microsoft.CrmSdk.Workflow" version="9.0.2.4" targetFramework="net452" />
<package id="Microsoft.CrmSdk.XrmTooling.CoreAssembly" version="9.0.2.7" targetFramework="net452" />
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.22.302111727" targetFramework="net452" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />

当我运行此代码时,我在 Microsoft.Xrm.Tooling.Connector.CrmServiceClient.Execute(OrganizationRequest request) 处收到 NullReferenceException,LastCrmError 为

无法登录到 Dynamics CRM************ 异常 - RetrieveAllEntities:从 IOrganizationService 执行 (RetrieveAllEntities) 对 CRM 的请求 |=> 对象引用未设置为对象的实例。

一旦我将目标框架更改为 4.6.2,它就可以正常工作。问题是我们将此代码托管在 SQL Server 集成服务包中,出于某种原因,在 Windows 2016 上,SSIS 总是回退到 4.5.2 框架。

我们也在对此进行调查,但现在问题仍然存在,如果 Microsoft.CrmSdk.XrmTooling.CoreAssembly 包应该与 4.5.2 一起使用(nuget 自述文件说是),或者这是 SDK 中的错误。

最新的 .NET 4.7.X 框架已安装在 2016 服务器和我的 win 10 开发机器上,但两者都面临同样的问题。

标签: c#dynamics-crm.net-4.5tls1.2dynamics-365

解决方案


从版本 9 开始,Dynamics 365 强制执行 TLS 1.2,因为 .NET 4.5 默认使用 TLS 1.1,您会收到此错误。在上一篇文章中,您会发现客户端应用程序的解决方案是您已经尝试过的解决方案:

使用 .NET 框架4.6.2或更高版本重新编译您的客户端应用程序。

有一些关于如何从 SSIS 包(此处此处)强制实施 TLS 1.2 的文章,但不幸的是我还没有尝试过。如果这些没有帮助,您可以通过将SchUseStrongCrypto注册表设置更新为 DWORD:00000001 来解决该错误,如此处所述为依赖组件启用 TLS 1.2/更新 .NET Framework 部分)。


推荐阅读