Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 禁用OrganizationServiceProxy的代理类型_C#_Dynamics Crm_Xrmtoolbox - Fatal编程技术网

C# 禁用OrganizationServiceProxy的代理类型

C# 禁用OrganizationServiceProxy的代理类型,c#,dynamics-crm,xrmtoolbox,C#,Dynamics Crm,Xrmtoolbox,我使用的是预定义的IOrganizationService对象,无法修改,这超出了我的控制范围 默认情况下,此ioOrganizationService返回解析的类型,就好像EnableProxyTypes()在原始OrganizationServiceProxy上的某个位置被隐式调用一样 这破坏了所有的业务逻辑,因为早期绑定的实体不能那么容易地序列化,因为在不同的安装上,它们可以解析为不同的类型。因此,即使它们将成功序列化,也无法100%确定它们是否可以反序列化 更具体地说,它是用于XrmTo

我使用的是预定义的
IOrganizationService
对象,无法修改,这超出了我的控制范围

默认情况下,此
ioOrganizationService
返回解析的类型,就好像
EnableProxyTypes()
在原始
OrganizationServiceProxy
上的某个位置被隐式调用一样

这破坏了所有的业务逻辑,因为早期绑定的实体不能那么容易地序列化,因为在不同的安装上,它们可以解析为不同的类型。因此,即使它们将成功序列化,也无法100%确定它们是否可以反序列化

更具体地说,它是用于
XrmToolBox
的插件。如果宿主应用程序加载了使用早期边界的插件,这些生成的类型将通过反射发现,并应用于
Retrieve
RetrieveMultiple
调用的结果

例如,
RetrieveMultiple
to
account
实体响应通常包含
entity[]
,此数组的每个项都将
LogicalName
属性设置为
account

但是,如果在程序集中发现了早期绑定类型,我们将其称为
EarlyBouldLibrary.dll
,相同的
RetrieveMultiple
将返回
EarlyBouldLibrary.Account[]
。此数组的每个项都将从
实体
派生,并将包含与第一个示例中相同的字段,但具有附加属性

问题在于以下几点。如果我们尝试将
EarlyBouldLibrary.Account[]
序列化为
XML
它将失败。因为
EarlyBouldLibrary.Account
未知

好的,可以将类型添加到已知的。但不能保证有一天会在
NewEarlyBouldLibrary.dll
中找到另一个早期绑定类型。。。他们将拥有名称
NewEarlyBouldLibrary.Account
。。。这是未知的

好的,让我们假设序列化成功,不管引用了哪种类型
EarlyBouldLibrary.Account
NewEarlyBouldLibrary.Account
,但如果我们尝试反序列化,在这些早期绑定库不存在的环境中。。。行动将失败

所以,唯一的方法是不要使用特定的早期绑定类型,即我们无法控制的类型,而是使用标准和安全的
实体
。但当系统自动解析代理类型时,这是不可能的


所以,问题是:有没有办法禁用早期绑定类型的解析

您可以将代理重定向到另一个包含所需类型的程序集(甚至不包含任何早期绑定类型)

以下示例重置代理程序集:

private void ResetProxyAssembly(IOrganizationService service)
{
    var serviceProxy = (OrganizationServiceProxy) service;
    serviceProxy.EnableProxyTypes();
}
private void ResetProxyAssembly(IOrganizationService service)
{
    var serviceProxy = (OrganizationServiceProxy) service;
    serviceProxy.EnableProxyTypes(typeof(MyEarlyBoundEntity).Assembly);
}
在某些情况下,这可能不起作用。相反,您可以显式选择所需的代理程序集:

private void ResetProxyAssembly(IOrganizationService service)
{
    var serviceProxy = (OrganizationServiceProxy) service;
    serviceProxy.EnableProxyTypes();
}
private void ResetProxyAssembly(IOrganizationService service)
{
    var serviceProxy = (OrganizationServiceProxy) service;
    serviceProxy.EnableProxyTypes(typeof(MyEarlyBoundEntity).Assembly);
}

能否将
[assembly:Microsoft.Xrm.Sdk.Client.ProxyTypesAssembly]
添加到
EarlyBouldLibrary.dll
NewEarlyBouldLibrary.dll
程序集的AssemblyInfo文件中?

我不明白你的问题,你能扩展或举例说明这个序列化问题吗?@GuidoPreite我有扩展说明来解释这个问题。你们能再看一下吗?这不是一个直接的答案,但我想把早期绑定类型转换回实体可能会有所帮助。relatedEntity.ToEntity()@Davlumbaz很好的解决方法!若并没有绑定早期绑定类型,我将尝试并添加一些处理。若看到一些带有ErrorDot的代码不适用于我的特定情况,可能会有所帮助。第一步失败-强制转换到
OrganizationServiceProxy
。但这个想法很好,可能会在其他情况下奏效!您的场景是插件还是工作流活动?