Как создать одно решение.net для crm 2011, которое подключается к двум различным служебным контекстам, используя ранний связанный код

Я хочу создать консольное приложение VS 2010 C#, которое подключается к двум (или более) различным служебным контактам / клиентам CRM 2011. Я хочу иметь возможность обновлять данные в одном с данными из другого.

Если я создаю два разных ранних связанных класса с помощью crmsvcutil, я получаю ошибку компилятора: "Дублировать" атрибут "Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute" "

Если я объединяю два файла, он компилируется, но затем я получаю ошибку во время выполнения: "Тип прокси с учетной записью имени был определен несколькими типами".

Как это можно сделать?

2 ответа

Решение

Создайте отдельный проект библиотеки для каждого набора классов с ранней привязкой и поместите один из файлов crmsvcutil в каждую библиотеку (при необходимости добавьте ссылки на сборки). Теперь в консольном приложении добавьте ссылки на библиотеки.

Допустим, я создал два библиотечных проекта, которые компилируются в Proxy1.dll и Proxy2.dll. Корневыми пространствами имен для каждой библиотеки являются Proxy1 и Proxy2. В ConsoleApp.exe я добавляю две ссылки и следующее:

var url1 = new Uri(".../XRMServices/2011/Organization.svc");
var proxy1 = new OrganizationServiceProxy(url1, null, null, null);
proxy1.EnableProxyTypes(Assembly.Load("Proxy1")); // Proxy1.dll

var url2 = new Uri(".../XRMServices/2011/Organization.svc");
var proxy2 = new OrganizationServiceProxy(url2, null, null, null);
proxy2.EnableProxyTypes(Assembly.Load("Proxy2")); // Proxy2.dll

using (var context1 = new Proxy1.Proxy1ServiceContext(proxy1))
using (var context2 = new Proxy2.Proxy2ServiceContext(proxy2))
{
  var accounts1 = context1.AccountSet;
  var accounts2 = context2.AccountSet;

  foreach (var account in accounts1) Console.WriteLine("1: {0}: {1}", account.GetType(), account.Id);
  foreach (var account in accounts2) Console.WriteLine("2: {0}: {1}", account.GetType(), account.Id);
}

Вы можете реализовать интерфейс ICustomizeCodeDomService и отключить автоматическую генерацию атрибута ProxyTypesAssemblyAttribute. Пока они находятся в разных пространствах имен, у вас будет одна DLL, и вам не придется загружать две отдельно.

** ОБНОВИТЬ **

Это не будет работать. Пожалуйста, смотрите /questions/39004901/neskolko-fajlov-s-rannim-svyazyivaniem-v-veb-servise/39004908#39004908

Другие вопросы по тегам