2016-04-15 43 views
6

Mam ten prosty C# program:Nie można załadować typu '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(); 
    } 
    } 
} 

i skompilować go z mono (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 

kiedy wykonać, błąd rzucone: wersja

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 

My Npgsql.dll

$ monop2 -r Npgsql.dll 

Assembly Information: 
Npgsql 
Version=2.2.0.0 
Culture=neutral 
PublicKeyToken=5d8b90d52f46fda7 

Mój kompilator:

$ 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 

Wreszcie moje środowisko:

$ uname --all 
Linux abe 4.5.0-1-ARCH #1 SMP PREEMPT Tue Mar 15 09:41:03 CET 2016 x86_64 GNU/Linux 

Dziękuję

Odpowiedz

13

Mam jedno pytanie - czy masz Mono.Security.dll biblioteki wewnątrz folderu bin? Jeśli tak, usuń go i spróbuj ponownie.

+0

Tak, mam Mono.Security.dll w bin. Po usunięciu działa! Dzięki – o3o

+3

Miałem ten sam problem, który wydaje się być aktualny (prawdopodobnie związany z najnowszymi aktualizacjami mono). – picrap

+0

Miałem ten sam problem w Linuksie, używając JetBrains Rider. Plik dll znajduje się w folderze usługi. Usunięcie pliku nie działa. Biblioteka DLL została skopiowana ponownie podczas kompilacji. Edytowałem /packages/Npgsql.2.2.2/net45/Npgsql.xml i komentowałem sześć wierszy dla Mono Security. To też nie zadziałało. Zmieniłem nazwę pliku /packages/Npgsql.2.2.2/net45/Mono.Security.dll na junk.Mono.Security.dll.junk i to zadziałało. –

0

Chciałbym umieścić te informacje dla osób, które dostanie inny wyjątek jak ja miałem:

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 

na

conn.Open(); 

ale rozwiązanie PIKos działa na mnie też.

Używam:

Mono JIT compiler version 4.4.0 (tarball Tue Jun 14 13:41:51 UTC 2016) 

Npgsql.dll version 2.1.0.0 
0

budynku z dala od użytkownika @ pikos odpowiedź, odkryłem jeden z zespołów w pakiecie Nuget że używam wysyłają swój własny Mono.Security.dll. Jednak mono 4.4.1 moves some of the types out of that assembly, i prawdopodobnie przenosi również niektóre. Ponieważ nie miałem wyraźnego odniesienia do Mono.Security, kompilacja [x | ms] rozwiązała pośrednią zależność, używając niezgodnego zestawu w moim folderze packages.

Aby rozwiązać ten problem, bez żadnych innych obejść (np. Usuwanie złożeń przy każdym kompilacji), właśnie dodałem jawne odniesienie do zestawu do systemu Mono.Security. Zmusiło to do użycia wersji 4.4.1 w GAC. Nie używając tej z nugetu, zgubiłem łatkę, która skłoniła budowniczego nugetu do włączenia własnego Mono.Security, ale na razie mam z tym wszystko. YMMV.