4

我想创建一个 VS 2010 C# 控制台应用程序,它连接到两个(或更多)不同的 CRM 2011 服务上下文/租户。我希望能够用另一个数据更新数据。

如果我使用 crmsvcutil 创建两个不同的早期绑定类,则会出现编译器错误:“重复 'Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute' 属性”

如果我连接这两个文件,它会编译,但会出现运行时错误:“具有名称帐户的代理类型已由多种类型定义”。

如何实现?

4

2 回答 2

5

为每组早期绑定的类创建一个单独的库项目,并在每个库中放置一个 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);
}
于 2012-05-17T19:10:18.000 回答
0

您可以实现 ICustomizeCodeDomService 接口并禁用 ProxyTypesAssemblyAttribute 的自动生成。只要它们位于不同的命名空间中,您就会拥有一个 dll,而不必分别加载两个。

** 更新 **

这行不通。请参阅https://stackoverflow.com/a/24785440/227436

于 2013-08-05T14:03:32.313 回答