Microsoft.CrmSdk.XrmTooling.CoreAssembly 使用 Target Framework .NET 4.5.2 在 CrmServiceClient.Execute 上导致空引用异常

Microsoft.CrmSdk.XrmTooling.CoreAssembly with Targetframework .NET 4.5.2 causes NullReference Exception on CrmServiceClient.Execute

我们在面向 .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" />

当我 运行 这段代码时,我得到一个 NullReferenceException Microsoft.Xrm.Tooling.Connector.CrmServiceClient.Execute(OrganizationRequest 请求),LastCrmError 为

Unable to Login to Dynamics CRM************ Exception - RetrieveAllEntities : Execute (RetrieveAllEntities) request to CRM from IOrganizationService |=> Object reference not set to an instance of an object.

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

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

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

我使用 4.5.2 成功地 运行 上面的代码。

检查你的 app.config。添加以下标签并尝试。

<startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup>

谢谢

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

Recompile your client applications using .NET framework 4.6.2 or higher.

有一些文章介绍了如何从 SSIS 包中强制执行 TLS 1.2(here and here), but unfortunately I haven't tried them. If these don't help, you can workaround the error by updating the SchUseStrongCrypto registry setting to DWORD:00000001 as described here(为依赖的 components/Update .NET Framework 部分启用 TLS 1.2)。