我想创建一个 VS 2010 C# 控制台应用程序,它连接到两个(或更多)不同的 CRM 2011 服务上下文/租户。我希望能够用另一个数据更新数据。
如果我使用 crmsvcutil 创建两个不同的早期绑定类,则会出现编译器错误:“重复 'Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute' 属性”
如果我连接这两个文件,它会编译,但会出现运行时错误:“具有名称帐户的代理类型已由多种类型定义”。
如何实现?
我想创建一个 VS 2010 C# 控制台应用程序,它连接到两个(或更多)不同的 CRM 2011 服务上下文/租户。我希望能够用另一个数据更新数据。
如果我使用 crmsvcutil 创建两个不同的早期绑定类,则会出现编译器错误:“重复 'Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute' 属性”
如果我连接这两个文件,它会编译,但会出现运行时错误:“具有名称帐户的代理类型已由多种类型定义”。
如何实现?
为每组早期绑定的类创建一个单独的库项目,并在每个库中放置一个 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,而不必分别加载两个。
** 更新 **