2016-04-15 4 views
6

Ich habe diese einfache C# Programm laden:Typ konnte nicht '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(); 
    } 
    } 
} 

und ich kompilieren es mit 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 

, wenn ich ausführen, wird ein Fehler ausgelöst:

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 

Meine Npgsql.dll Version

$ monop2 -r Npgsql.dll 

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

Mein Compiler:

$ 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 

Schließlich meiner Umgebung:

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

Danke

Antwort

13

ich eine Frage haben - tun Sie Bibliothek Mono.Security.dll innerhalb Binärordner haben? Wenn ja, löschen Sie es bitte und versuchen Sie es erneut.

+0

Ja, ich habe Mono.Security.dll in bin. Nach dem Löschen funktioniert es! Danke – o3o

+3

Ich hatte das gleiche Problem, und das scheint neu zu sein (wahrscheinlich im Zusammenhang mit Monos neuesten Updates). – picrap

+0

Ich hatte das gleiche Problem in Linux mit JetBrains Rider. Die DLL befand sich im Dienstordner. Das Löschen der Datei hat nicht funktioniert. Die DLL wurde während des Builds erneut kopiert. Ich habe /packages/Npgsql.2.2.2/net45/Npgsql.xml bearbeitet und sechs Zeilen für Mono Security auskommentiert. Das hat auch nicht funktioniert. Ich habe /packages/Npgsql.2.2.2/net45/Mono.Security.dll in junk.Mono.Security.dll.junk umbenannt, und das hat funktioniert. –

0

Ich möchte diese Informationen für die Menschen setzen, die wie mich andere Ausnahme bekommen, ich hatte:

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 

auf

conn.Open(); 

aber PIKOS Lösung funktioniert auch für mich.

Ich verwende:

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

Npgsql.dll version 2.1.0.0 
0

Gebäude aus der @ PIKOS Antwort, entdeckte ich eine der Baugruppen in einem nuget Paket, das ich ausgeliefert bin mit seiner eigenen Mono.Security.dll. Allerdings, Mono 4.4.1 moves some of the types out of that assembly, und wahrscheinlich bewegt sich auch einige in. Da ich keinen expliziten Verweis auf Mono.Security hatte, löste [x | ms] build die indirekte Abhängigkeit mithilfe der inkompatiblen Assembly in meinem Ordner packages.

Um dies ohne weitere Problemumgehungen (z. B. das Löschen von Assemblys bei jedem Build) zu beheben, habe ich gerade einen expliziten Assembly-Verweis auf Mono.Security des Systems hinzugefügt. Dies zwang die Version 4.4.1 im GAC stattdessen verwendet zu werden. Indem ich nicht den aus dem nugget nutzte, verlor ich den Patch, der den Builder des nugget veranlasst hatte, seine eigene Mono.Security einzubauen, aber damit bin ich einverstanden. YMMV.