无法加载类型“System.Net.Security.SslStream”
Posted
技术标签:
【中文标题】无法加载类型“System.Net.Security.SslStream”【英文标题】:Could not load type 'System.Net.Security.SslStream' 【发布时间】:2016-08-07 02:20:30 【问题描述】:我有这个简单的 C# 程序:
using Npgsql;
public class App
public static void Main(string[] args)
const string CONNECTION_STRING = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";
using (var conn = new NpgsqlConnection(CONNECTION_STRING))
conn.Open();
我用单声道(mcs)编译它:
mcs -target:exe -lib:bin -r:System.Data.dll -r:Npgsql.dll -r:System.dll -r:Mono.Security.dll -out:bin/ssl.exe src/App.cs
当我执行时,抛出一个错误:
Unhandled Exception:
System.TypeLoadException: Could not load type 'System.Net.Security.SslStream' from assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
at Npgsql.NpgsqlConnector.Open () <0x4155f7f0 + 0x00115> in <filename unknown>:0
at Npgsql.NpgsqlConnectorPool.GetPooledConnector (Npgsql.NpgsqlConnection Connection) <0x4155c8d0 + 0x00a4f> in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not load type 'System.Net.Security.SslStream' from assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
at Npgsql.NpgsqlConnector.Open () <0x4155f7f0 + 0x00115> in <filename unknown>:0
at Npgsql.NpgsqlConnectorPool.GetPooledConnector (Npgsql.NpgsqlConnection Connection) <0x4155c8d0 + 0x00a4f> in <filename unknown>:0
我的 Npgsql.dll 版本
$ monop2 -r Npgsql.dll
Assembly Information:
Npgsql
Version=2.2.0.0
Culture=neutral
PublicKeyToken=5d8b90d52f46fda7
我的编译器:
$ mcs --version
Mono C# compiler version 4.4.0.0
$ mono --version
Mono JIT compiler version 4.4.0 (Stable 4.4.0.40/f8474c4 Mon Mar 28 12:22:29 UTC 2016)
Copyright (`u`C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: altstack
Notifications: epoll
Architecture: amd64
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen
最后,我的环境:
$ uname --all
Linux abe 4.5.0-1-ARCH #1 SMP PREEMPT Tue Mar 15 09:41:03 CET 2016 x86_64 GNU/Linux
谢谢
【问题讨论】:
【参考方案1】:我有一个问题 - bin 文件夹中有 Mono.Security.dll 库吗?如果是这样,请删除它并重试。
【讨论】:
是的,我在 bin 中有 Mono.Security.dll。删除后有效!谢谢 我遇到了同样的问题,而且这似乎是最近的问题(可能与 mono 的最新更新有关)。 我在使用 JetBrains Rider 的 Linux 中遇到了同样的问题。该dll位于服务文件夹中。删除文件不起作用。在构建过程中再次复制了 dll。我编辑了 /packages/Npgsql.2.2.2/net45/Npgsql.xml 并为 Mono Security 注释掉了六行。那也没有用。我将 /packages/Npgsql.2.2.2/net45/Mono.Security.dll 重命名为 junk.Mono.Security.dll.junk,并且成功了。【参考方案2】:我想将此信息提供给像我这样会遇到不同异常的人,我有:
System.TypeLoadException: Failure has occurred while loading a type. at Npgsql.NpgsqlConnector.Open () [0x0002b] in <filename unknown>:0 at Npgsql.NpgsqlConnectorPool.GetPooledConnector (Npgsql.NpgsqlConnection Connection) [0x0017e] in <filename unknown>:0
在
conn.Open();
但 PIKos 解决方案也适用于我。
我正在使用:
Mono JIT compiler version 4.4.0 (tarball Tue Jun 14 13:41:51 UTC 2016)
Npgsql.dll version 2.1.0.0
【讨论】:
【参考方案3】:根据@pikos 的回复,我发现我正在使用的一个nuget 包中的一个程序集是它自己的Mono.Security.dll
。但是,mono 4.4.1 moves some of the types out of that assembly,并且可能也会移动一些。因为我没有明确引用 Mono.Security
,所以 [x|ms]build 通过使用 mypackages
文件夹中的不兼容程序集来解决间接依赖关系。
为了解决这个问题,无需任何其他解决方法(例如,每次构建都删除程序集),我只是添加了对系统Mono.Security
的显式程序集引用。这迫使改用 GAC 中的 4.4.1 版本。由于不使用 nuget 中的那个,我丢失了促使 nuget 的构建者包含他们自己的 Mono.Security 的补丁,但我现在可以接受。 YMMV。
【讨论】:
【参考方案4】:正如 PiKos 指出的那样,罪魁祸首是 Npgsql 2.x NuGet 包嵌入的 Mono.Security.dll
。在您的 bin 目录中删除它确实可以解决此问题,但您必须在每次清理和重建解决方案时手动执行此操作。
我没有删除它,而是选择修复 ~/.nuget/packages/npgsql/2.2.7/lib/net45
中的 Npgsql 2.2.7 包,方法是将 Mono.Security.dll
重命名为 Mono.Security.dll.original
并在单声道中添加指向 Mono.Security.dll
的符号链接广汽。这是我的~/.nuget/packages/npgsql/2.2.7/lib/net45
目录的样子:
lrwxr-xr-x Mono.Security.dll -> /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll
-rwxrw-rw- Mono.Security.dll.original
-rwxrw-rw- Npgsql.dll
-rwxrw-rw- Npgsql.xml
drwxr-xr-x de
drwxr-xr-x es
drwxr-xr-x fi
drwxr-xr-x fr
drwxr-xr-x ja
drwxr-xr-x zh-CN
此解决方案的优势在于它适用于所有您引用 Npgsql NuGet 包的项目。
如果你因为选择了Npgsql.EntityFramework而对 Npgsql 2.2.7 产生了依赖,那么只需使用更新的 EntityFramework6.Npgsql 包,它依赖于 Npgsql >= 4.0.2,这个问题根本不存在.
【讨论】:
以上是关于无法加载类型“System.Net.Security.SslStream”的主要内容,如果未能解决你的问题,请参考以下文章
Global.asax 中的“解析器错误消息:无法加载类型”
无法加载一种或多种请求的类型。无法加载文件或程序集“Microsoft.VisualStudio.Coverage.CoreLib.Net
无法加载类型“AjaxControlToolkit.Sanitizer.AntiXssSanitizerProvider”。