无法从程序集'System,Version = 4.0.0.0

时间:2016-04-11 18:03:38

标签: c# wcf .net-4.0 .net-4.6.1

我们在Windows服务中托管了现有的WCF服务。该服务已针对.NET Framework 4.0构建和部署。

几天前,我们安装了.NET Framework 4.6.1。该服务器以前具有.NET Framework 4.0。

我们现在看到该服务产生的异常。我已经包含了下面的异常详细信息以及FillProcessorNetTcpBinding类的代码。

似乎.NET升级以一种不向后兼容.NET 4.0的方式更新了一些程序集。我们的目标是像以前一样拥有预先部署的服务功能,而无需针对.NET 4.6.1。

为什么在应用程序面向.NET 4.0时使用.NET 4.5+程序集?

有什么建议吗?

<TypeLoadException xmlns="http://schemas.datacontract.org/2004/07/System">

<Message>
Could not load type 'System.Net.WebSockets.WebSocket' from assembly 'System, Version=4.0.0.0, Culture=neutral,     PublicKeyToken=b77a5c561934e089'.
</Message>

<Source>
System.ServiceModel
</Source>

<TargetSite>
Boolean get_IsApplicationTargeting45()
</TargetSite>

<StackTrace>
   at System.ServiceModel.OSEnvironmentHelper.get_IsApplicationTargeting45()
   at System.ServiceModel.Channels.ConnectionOrientedTransportBindingElement..ctor()
   at System.ServiceModel.NetTcpBinding.Initialize()
   at System.ServiceModel.NetTcpBinding..ctor()
   at Company.Shared.Processor.Access.WCF.ProcessorNetTcpBinding..ctor() in c:\TeamCity\BuildAgent\work\11b9dc3c2c069bfb\Release    \Main\Shared\Processor\Access\WCF\ProcessorNetTcpBinding.cs:line 12
   at Company.Shared.Processor.Access.WCF.Client.ProcessorServiceClient.CreateTcpEndPoint(String hostName, UInt16 portNumber) in c:\TeamCity\BuildAgent\work\11b9dc3c2c069bfb\Release\Main\Shared\Processor\Access\WCF    \ProcessorServiceClient.cs:line 34
   at Company.shared.Processor.Listener.ListenerManager.CallProcessor(Object msg) in c:\TeamCity\BuildAgent\work\11b9dc3c2c069bfb\Release\Main\Shared\Processor\Listener\Service\ListenerManager.cs:line 212
</StackTrace>

</TypeLoadException>

扩展NetTcpBinding的引用类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.ServiceModel;
using System.Text;

namespace Company.Shared.Processor.Access.WCF
{
    public class ProcessorNetTcpBinding : NetTcpBinding
    {
        public ProcessorNetTcpBinding()
        {
            MaxBufferSize = Int32.MaxValue;
            MaxReceivedMessageSize = MaxBufferSize;
            ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
            ReaderQuotas.MaxArrayLength = Int32.MaxValue;
            ReaderQuotas.MaxBytesPerRead = 65536;
            ReaderQuotas.MaxDepth = 64;
            SendTimeout = TimeSpan.FromMinutes(5);

            Security.Mode = SecurityMode.Transport;
            Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
            Security.Transport.ProtectionLevel = ProtectionLevel.Sign;
        }
    }
}

的App.config

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="CompanyWcf" type="Company.Shared.Utils.Wcf.Config.WcfConfigSection, Company.Shared.Utils"/>
  </configSections>
    <appSettings>    
    <add key="Company.Shared.Alerting" value="http://Alerting.company.com/api/"/>
    </appSettings>
    <connectionStrings>
      <add name="AlertingDb" connectionString="Data Source=SQLSERVER;Initial Catalog=Company;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
      <add name="OracleConnection" connectionString="Data Source=ODEP;User ID=/;Pooling=false;Connection Timeout=260;" providerName="System.Data.OracleClient" />
      <add name="ThorConnection" connectionString="Data Source=SQLSERVER;Initial Catalog=Thor;Integrated Security=True"/>
    </connectionStrings>
   <!-- Company WCF-->
   <CompanyWcf>
      <Services>
        <add name="Company Processor" host="localhost" port="4329" />
        <add name="Company Processor Listener" host="localhost" port="4330" />
      </Services>
   </CompanyWcf>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

3 个答案:

答案 0 :(得分:0)

我认为如果您使用System.Net.WebSockets.WebSocket类型,那么您必须至少定位.NET 4.5,因为您写道:

  直到.NET 4.5才引入

System.Net.WebSockets.WebSocket,因此对于面向.NET 4.0的应用程序来说,它并不存在。

这正是TypeLoadException的意思。在.NET Framework 4.0

的程序集中找不到此类型
<Message>
Could not load type 'System.Net.WebSockets.WebSocket' from assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
</Message>

问题是:为什么在面向.NET 4.0时使用.NET 4.5类型时可以成功构建解决方案?

答案 1 :(得分:0)

.Net 4.5 / 4.6是就地更新,即更新会使用较新的位替换计算机上的4.0程序集。您的应用程序仍然可以定位4.0并获得4.0行为,但在引擎盖下它将使用4.5 / 4.6程序集。

你得到的错误很奇怪。您的计算机上的WCF程序集似乎已更新为4.6,而System.dll则不是。你能检查一下System.dll的版本,看它是否升级了吗?它应该升级。如果不是,可能重新安装框架或重启机器可能有所帮助。

答案 2 :(得分:0)

正如X-Mao所指出的那样,如果您遇到问题,我怀疑您的计算机的.NET Framework设置可能有问题。如果您尝试过X-Mao建议的步骤,但仍然无法解决您的问题。这可能有两个可能的原因: 1. .NET Framework安装问题仍然存在。请检查以下内容:  检查System.dll和system.servicemodel.dll文件版本。文件版本应该类似于4.6.1055.0。  检查您的计算机注册表(使用Regedit.exe)应具有以下条目: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client] "Version"="4.6.01055" "TargetVersion"="4.0.0" "Install"=dword:00000001 "InstallPath"="C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\" "Release"=dword:0006041f 如果您的计算机具有不同的文件版本或.NET Framework安装程序regkeys,并且您认为已在计算机上安装了.NET v4.6.1。请在http://connect.microsoft.com/处打开一个问题,其中包含详细的安装步骤以及上面的文件版本和regkeys值信息。 2.您的计算机具有正确的.NET V4.6.1文件版本和设置regkeys,但是,您仍然可以重现问题。请使用repro程序在http://connect.microsoft.com/打开一个问题,并提供文件版本和设置regkey信息。我们会做进一步的调查。