C# 为什么.Net 4.0构建的客户端数据契约会在.Net 4.5应用程序中导致MethodAccessException?

C# 为什么.Net 4.0构建的客户端数据契约会在.Net 4.5应用程序中导致MethodAccessException?,c#,wcf,.net-4.0,xml-serialization,.net-4.5,C#,Wcf,.net 4.0,Xml Serialization,.net 4.5,我有一个名为WebAccounts.dll的类库,它调用一些(我自己的)WCF web服务。我让web服务项目自动构建其数据契约的客户端版本,供其.net客户端使用。它同时构建了.NET3.5和4.0版本。因此,我: OMWebServices.dll OMWebServices.ClientDataContracts35.dll OMWebServices.ClientDataContracts.dll (.net 4.0 version) 作为我们正在建设的新网站的一部分,我将WebAcc

我有一个名为WebAccounts.dll的类库,它调用一些(我自己的)WCF web服务。我让web服务项目自动构建其数据契约的客户端版本,供其.net客户端使用。它同时构建了.NET3.5和4.0版本。因此,我:

OMWebServices.dll
OMWebServices.ClientDataContracts35.dll
OMWebServices.ClientDataContracts.dll (.net 4.0 version)
作为我们正在建设的新网站的一部分,我将WebAccounts.dll从.NET3.5升级到了4.5。所以我还将它的ClientDataContracts引用从3.5版本更新到了4.0版本,因为它现在可以使用它了

现在,当WebAccounts尝试调用服务方法时,我得到一个MethodAccessException:

通过方法“WebAccounts.Data.receigence..ctor(System.String, IdentifierType)“访问方法”WebAccounts.OMConfigService.ConfigurationServiceClient.GetPrinction(System.String, OMWebServices.DataContracts.特许ID类型,布尔值)“”失败

如果我改回ClientDataContracts35,它会成功工作。令人困惑的是,更改我的数据协定程序集版本会影响我的代码是否可以访问生成的代理方法(该方法不在ClientDataContacts程序集中,并且是公共的)

我无意中发现,它说您可以将
添加到web.config中,以修复某种.net 4.5序列化兼容性问题。我尝试了一下,它在使用4.0 ClientDataContracts时修复了它。但是为什么呢

最后一个问题是,如果我在我的网站项目中跳过使用WebAccounts,只添加一个服务引用并直接调用同一个服务,它甚至可以与4.0 ClientDataContracts一起工作,而无需添加useLegacySerializerGeneration配置。因此,使用ClientDataContracts(4.0),网站可以直接调用web服务,但调用调用相同web服务的WebAccounts会得到例外。我还验证了WebAccounts在从测试项目调用时会获得异常,以排除任何特定于网站项目的内容


有人能解释一下这里发生了什么吗?

在.NET Framework v4.5中,XMLSerializer默认实现已更改为动态代码生成。这种动态代码生成方法的主要好处是,它不需要访问硬盘,这是客户要求的特性之一。但是,它的限制是不能从其他程序集访问非公共成员。这就是为什么在某些情况下会看到MethodAccessException。对于不需要此动态代码生成功能的客户,仍然可以通过使用[this blog post]()中记录的“useLegacySerializerGeneration”配置开关来使用v4.0序列化程序。基本上,这两种序列化代码路径都受支持