【问题标题】:OrganizationServiceProxy cannot be initialised after dlls are merged using ILMERGE使用 ILMERGE 合并 dll 后无法初始化 OrganizationServiceProxy
【发布时间】:2019-07-16 01:04:38
【问题描述】:

我在 C# (.NET 4.6.2) 中创建了一个 Windows 窗体应用程序。我正在使用以下代码在线连接到 Dynamics 365:

ClientCredentials clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = "XXXXX@XXX.onmicrosoft.com";
clientCredentials.UserName.Password = "XXXXXXXX";

Uri crmURL = new Uri("https://XXXXX.api.crm4.dynamics.com/XRMServices/2011/Organization.svc");

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (OrganizationServiceProxy orgaSvcProxy = new OrganizationServiceProxy(crmURL, null, clientCredentials, null))
{
    IOrganizationService orgaService = (IOrganizationService)orgaSvcProxy;
    if (orgaService != null)
    {
        Guid userid = ((WhoAmIResponse)orgaService.Execute(new WhoAmIRequest())).UserId;
        if (userid != Guid.Empty)
        {
            MessageBox.Show("Connection established successfully");
        }
    }
}

我在 VS 2015 (.NET 4.6.2) 项目中引用了以下 2 个 dll:

  1. Microsoft.Xrm.Sdk.dll
  2. Microsoft.Crm.Sdk.Proxy.dll

如果我从 VS IDE 启动 windows 窗体或使用 exe 文件启动 windows 窗体,一切正常。但是,如果我 使用 ILMERGE 将 exe 和上述两个 dll 合并到一个 exe 文件中 并使用合并的 exe 启动 windows 窗体,则以下代码行开始失败:

OrganizationServiceProxy orgaSvcProxy = new OrganizationServiceProxy(crmURL, null, clientCredentials, null)

上面的代码行抛出以下错误:

System.NullReferenceException:对象引用未设置为实例 的一个对象。在 Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.GetSDKVersionNumberFromAssembly() 在 Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.RetrieveServiceEndpointMetadata(类型 contractType, Uri serviceUri, Boolean checkForSecondary) 在 Microsoft.Xrm.Sdk.Client.ServiceConfiguration1..ctor(Uri serviceUri, Boolean checkForSecondary) at Microsoft.Xrm.Sdk.Client.OrganizationServiceConfiguration..ctor(Uri serviceUri, Boolean enableProxyTypes, Assembly assembly) at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateConfiguration[TService](Uri serviceUri, Boolean enableProxyTypes, Assembly assembly) at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateConfiguration[TService](Uri serviceUri) at Microsoft.Xrm.Sdk.Client.ServiceProxy1..ctor(Uri uri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials)在 Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy..ctor(Uri uri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials)在 ElevateCRMAccess.fmElevateCRMAcces.btnElevate_Click(对象发件人, System.Windows.Forms.Control.OnClick(EventArgs e)
处的 EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(消息和 m,鼠标按钮 按钮,Int32 点击)在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

我使用以下行通过 ILMERGE 合并程序集:

"$(SolutionDir)ILMERGE/IlMerge.exe" /target:winexe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319" /out:"$(SolutionDir)..\Output\ConnectToCRM.exe" "$(TargetDir)ConnectToCRM.exe" "$(TargetDir)Microsoft.Crm.Sdk.Proxy.dll" "$(TargetDir)Microsoft.Xrm.Sdk.dll"

请有人帮忙找出这里的问题。是什么导致合并的 exe 失败。

【问题讨论】:

    标签: c# dynamics-crm dynamics-365 ilmerge


    【解决方案1】:

    使用 SDK 从外部应用程序连接到 Dynamics 365(又名 CDS)的最先进技术是 CrmServiceClient,它在 Xrm Tooling NuGet 包中提供。

    将 NuGet 包添加到项目后,您就可以开始了。

    using Microsoft.Xrm.Tooling.Connector;
    var svc = new CrmServiceClient("Url=https://dev26.crm.dynamics.com; Username=user@dev26.onmicrosoft.com; Password=Pass; AuthType=Office365");
    svc.Retrieve("account", new Guid("7D9AAF71-5845-E811-A950-000D3A1D7326", new ColumnSet(true)) ;
    

    有关其他连接字符串,请参阅this answer

    我一直将它与 .NET Framework 4.7.1+ 一起使用,通过 Dynamics 365 v9 将 C# 应用程序连接到 Dynamics CRM 2013。

    无论您是否需要执行 ILMerge,您都可能需要考虑切换到 XrmTooling。如果您可以避免使用 ILMerge,那就更好了。作为记录,ILMerge is unsupported 用于插件。

    【讨论】:

    • 谢谢阿伦。即使使用 Xrm Tooling 结果也是一样的。直接在 VS 中运行或在存在所需 dll 的情况下使用 exe 运行正常。但是在与所有 dll 合并后运行 exe 时会引发以下错误:System.NullReferenceException:Object reference not set to an instance of an object. at Microsoft.Xrm.Tooling.Connector.CrmServiceClient.Execute(OrganizationRequest request)。我不是为插件编写此代码,而是想创建一个独立的可执行文件。
    • @Indie.Dev 如果它是独立的可执行文件,为什么需要使用 ILMerge?
    • 我想将此可执行文件分发给没有 dll 的用户。如果我不使用 ILMerge,那么我将不得不与 dll 一起分发 exe。我知道这不会是一个问题,但我只是好奇为什么合并后代码会失败。
    • 我过去在合并 Microsoft.Xrm.Sdk.dll 时遇到过问题。您可能想尝试合并除那个以外的所有内容。
    【解决方案2】:

    我知道这是一个老问题,但我刚刚看到这个问题,并认为也许一个答案可以帮助有同样问题的人。

    根据错误,问题是SDK正在查看DLL以确定SDK版本(GetSDKVersionNumberFromAssembly),而当您使用ILMerge合并dll时,您正在将程序集内容移动到新程序集中,因此SDK可以找不到版本,因为它不知道您的 dll。

    要解决此问题,您可以将 SDK dll 作为资源存储在您的程序集文件中并在启动时将其解压缩,或者使用Fody Custora 之类的工具来自动执行此过程。 Custora 的输出与 ILMerge 非常相似,但 Custora 不合并 IL,它只是将外部 dll 作为资源添加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多