OrganizationServiceProxy не может быть инициализирован после объединения библиотек с использованием ILMERGE - PullRequest
0 голосов
/ 18 мая 2019

Я создал приложение Windows Form в C # (.NET 4.6.2).Я использую приведенный ниже фрагмент кода для подключения к 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");
        }
    }
}

Я ссылался на следующие 2 dll в моем проекте VS 2015 (.NET 4.6.2): ​​

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

Все работает нормально, если я запускаю форму Windows из VS IDE или запускаю форму Windowsиспользуя exe-файл.Но если я сливаю exe и вышеупомянутые два dll в один exe-файл, используя ILMERGE , и запускаю форму Windows, используя объединенный exe, то следующая строка кода начинает давать сбой:

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

Над строкой кода выдается следующая ошибка:

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляраобъекта.по адресу Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.GetSDKVersionNumberFromAssembly () по адресу Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.RetrieveServiceEndpointMetadata (тип Контракт * Тип сервиса...ctor (Uri uri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials) в Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy..ctor (Uri uri, Uri homeRealmUri, ClientCredentials clientCredentials, клиентские_критерии для взыскательных объектов, устройство для перемещения по клиентскому центру (элемент управления_CCR)отправитель, EventArgs e) в System.Windows.Forms.Control.OnClick (EventArgs e)
в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent)в System.Windows.Forms.Control.WmMouseUp (сообщение & m, кнопка MouseButtons, щелчки Int32) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ButtonBase.WndProc (Message & m) в System.Windows.Forms.Button.WndProc (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & 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-файла.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Я знаю, что это старый вопрос, но я только видел этот вопрос и подумал, что, возможно, ответ может помочь людям с той же проблемой.

В соответствии с ошибкой, проблема в том, что SDK смотрит на DLL, чтобы определить версию SDK (GetSDKVersionNumberFromAssembly), и когда вы используете ILMerge для объединения библиотек, вы перемещаете содержимое сборки в новую сборку, и поэтому SDK может не узнать версию, так как она не знает вашу dll.

Чтобы решить эту проблему, вы можете сохранить SDK dll в качестве ресурса в файле сборки и извлечь его при запуске, или использовать инструмент, подобный Fody Custora , для автоматизации этого процесса. Вывод Custora очень похож на ILMerge, но Custora не объединяет IL, он просто добавляет внешние библиотеки в качестве ресурсов.

0 голосов
/ 19 мая 2019

Современное состояние использования 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)) ;

Пожалуйста, см. этот ответ для дополнительных строк подключения.

Я использую его с .NET Framework 4.7.1+ для подключения приложений C # к Dynamics CRM 2013 через Dynamics 365 v9.

Независимо от того, нужен ли вам ILMerge или нет, вы можете захотетьрассмотрите возможность перехода на XrmTooling.И если вы можете избежать ILMerge, тем лучше.Для справки, ILMerge не поддерживается для плагинов.

...