2016-04-15 3 views
6

Я этот простой C# программы:Не удалось загрузить тип 'System.Net.Security.SslStream'

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 

Спасибо

ответ

13

У меня есть один вопрос - у вас есть библиотека Mono.Security.dll внутри папки бин? Если да, удалите его и повторите попытку.

+0

Да, у меня есть Mono.Security.dll в корзине. После удаления это работает! Спасибо – o3o

+3

У меня была такая же проблема, и это кажется недавним (вероятно, связано с последними обновлениями mono). – picrap

+0

У меня была такая же проблема в Linux с помощью JetBrains Rider. 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, и это сработало. –

0

Я хотел бы поставить эту информацию для людей, которые будут получать другое исключение, как я, у меня было:

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 
0

Строительство офф-х @ pikos ответ, я обнаружил, что одна из сборок в пакете NuGet, что я использую это погружен собственный Mono.Security.dll. Тем не менее, mono 4.4.1 moves some of the types out of that assembly, и, вероятно, также перемещает некоторые из них. Поскольку я не имел явной ссылки на Mono.Security, сборка [x | ms] устраняла косвенную зависимость, используя несовместимую сборку в моей папке packages.

Чтобы устранить это, без каких-либо других обходных решений (например, удаление сборок при каждой сборке), я просто добавил явную ссылку на сборку для системы Mono.Security. Это вынудило использовать версию 4.4.1 в GAC. Не используя один из nuget, я потерял патч, который побудил строителя nuget включить свою собственную Mono.Security, но теперь я в порядке. YMMV.