2009-09-08 22 views
9

EDIT (die ganze Frage, es war zu unklar)Warum findet .NET die OpenSSL.NET-DLL nicht?

I OpenSSL.NET

Die OpenSSL.NET Installationsanweisungen Seite verwenden möchten: INSTALL

Make sure you have libeay32.dll and ssleay32.dll in the current working directory of your application or in your PATH. DONE
In your .NET project, add a reference to the ManagedOpenSsl.dll assembly. DONE

ich gesetzt haben libeay32.dll und ssleay32.dll in meinem bin/Debug und bin/Release Verzeichnisse. Ich habe sie auch in system32 gesetzt.

Hier ist mein FULL-Code:

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       OpenSSL.Crypto.RSA rsa = new OpenSSL.Crypto.RSA(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.InnerException.Message); 
      } 
      Console.Read(); 
     } 
    } 
} 

ich die folgende Fehlermeldung erhalten: Unable to load DLL 'libeay32' http://localhostr.com/files/a719c5/Error.gif (kann nicht DLL 'libeay32' laden)

Hier ist der Process Monitor log (auf Anfrage):

Was mache ich falsch? Warum wird die DLL nicht gefunden?

+2

BTW, ist C# nicht suchen für DLLs - .NET tut. –

+2

Ist Ihr System 64-Bit? Und noch wichtiger: Ist Ihre .NET-App AnyCPU oder x86? – ConsultUtah

+0

Mein System ist 32-Bit, und ich weiß nicht, wie man die andere Einstellung überprüft. – Lazlo

Antwort

5

Probieren Sie die neueste Version von OpenSSL.NET (0.4.1), die jetzt vordefinierte libeay32.dll- und ssleay32.dll-Binärdateien enthalten sollte, die statisch mit dem CRT verbunden sind. Alternativ können Sie diese Bibliotheken selbst erstellen oder ein "offizielles" Build von openssl.org verwenden.

0

Die .NET-Methode, dies zu tun, ist, Ihre Baugruppe in der global assembly cache zu installieren.

Each computer where the common language runtime is installed has a machine-wide code cache called the global assembly cache. The global assembly cache stores assemblies specifically designated to be shared by several applications on the computer.

+0

Gibt es keinen einfacheren Weg? Angesichts der Tatsache, dass ich meine Binärdateien teilen werde, ist das nicht sehr nützlich. – Lazlo

+0

In Anbetracht dessen, dass Sie mit .NET nicht vertraut sind, schlage ich vor, "wenn Sie in Rom sind, machen Sie es wie die Römer". –

2

Ohne genau zu Ihrem Code zu suchen, bekomme ich diesen Fehler, wenn ich:

  • haben nicht den DLLs im Pfad der ausführbaren Datei (nicht, wo Ihr sln wohnt, aber wo die .exe wird gemacht, typischerweise in bin/debug oder bin/x86/debug oder was auch immer).
  • haben nicht die richtige Signatur der aufrufenden Funktion (dh, ich habe einen ganzzahligen Parameter weggelassen, die Rückgabetypen stimmen nicht überein usw.).
  • bin nicht die Marshalling die Typen richtig (dh, BOOL wird als bool marshallt, während bool als vorzeichenlose Single-Byte-Integer, etc. marshalled) - während dieser letzte die Ausnahme nicht verursachen kann, kann es entschieden funky Verhalten verursachen .
  • bin auf einer 64-Bit-Plattform und rufe eine 32-Bit-DLL. Die Zeigergrößen sind alle unterschiedlich, und die DLL wird wahrscheinlich einfach abstürzen und diese Ausnahme verursachen.

EDIT: Wenn alles andere fehlschlägt, versuchen dependency walker, weil es klingt wie Ihre dlls andere DLLs aufrufen, die nicht in Ihrem Pfad oder im Verzeichnis der ausführbaren Datei sind.

+0

Ich habe die Dlls in der .exe-Pfad, und die Funktion ist richtig. – Lazlo

+0

Zu Ihrer Bearbeitung: Ich bin sicher, dass die Typen richtig verwendet werden. Ich initialisiere nur die API mit dem Standardcode. Und ich habe eine 32-Bit-Maschine mit 32-Bit-DLLs. – Lazlo

+0

Dependency Walker, dann, wie ich hinzugefügt habe. Es wird Ihnen wahrscheinlich zeigen, dass Sie etwas verpassen. – mmr

1

Ihr Problem ist mit dieser Frage verbunden:

DllNotFoundException, but DLL is there

Überprüfen Sie, ob alle depencencies in demselben Ordner Ihrer Anwendung sind oder registriert sind.

+0

tat ich. Funktioniert immer noch nicht. Lies die Bearbeitung bitte noch einmal, falls nicht. – Lazlo

1

Versuchen Sie es mit Sondieren.Sie müssen eine XML-Konfigurationsdatei erstellen, die als ausführbarer vollständiger Name der Anwendung (oder als Assembly bezeichnet, die Ihre nicht verwaltete DLL benötigt) mit der Erweiterung .config benannt wird. Z.B. Wenn Ihre Anwendungen den Namen myapp.exe haben, heißt die Konfigurationsdatei myapp.exe.config. Die Konfigurationsdatei muss sich im selben Verzeichnis wie die ausführbare Datei/Assembly befinden.

Die Konfigurationsdatei ist eine einfache XML-Datei:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <assemblyuBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="PATH" /> 
    </assemblyuBinding> 
    </runtime> 
</configuration> 

Nun ist die Anwendung in Wegsuche wird, wenn die Baugruppen geladen werden. PATH ist relativ zur Config/Assembly-Datei.

Nicht sicher, ob es für nicht verwaltete DLLs funktioniert, aber es ist den Versuch wert.

0

Als letztes Mittel, wenn sonst nichts funktioniert:

Es kann nützlich sein, zu wissen, wo die Anwendung (.net oder nicht) für den DLLs suchen. Verwenden Sie einfach Process Monitor und filtern Sie nach dem Dateinamen der DLL. Kopieren Sie es dann an einen Ort, an dem die Anwendung danach sucht.

+0

Hier ist das Protokoll procmon: http://localhostr.com/files/726a46/ProcMon.gif – Lazlo

0

Vermutlich fehlen Ihnen die Redistributables von VC++. Ich nehme an, dass OpenSSL.NET nur x86 ist, also können Sie grab the VS2008 version x86 redistributable, wenn sie Release-Builds sind.

Andernfalls, wenn sie sind Debug-Builds (Sie werden sehen, Microsoft.VC90.DebugCRT in Ereignisanzeige oder die sxstrace logs), dann müssen Sie entweder auf:

  • sie neu aufbauen als Release
  • installieren oder das Debug-redistributables von einer anderen Maschine
  • installieren Sie Visual C++ kopieren in Visual Studio (oder wahrscheinlich, Visual C++ Express)
0

Ich fand eine Lösung.

Leider hat das VS2008 C++ Redistributable-Paket nicht funktioniert - ich musste die SP1-Version und VC++ 2008 installieren. Der Autor sagte in einem Kommentar auf seiner Website, dass es ein Fehler auf seiner Seite war, und nicht meiner. Er kompiliert gerade die DLLs, um statisch verknüpft zu werden. Vielen Dank an alle, die mir geholfen haben :)

0

Versuchen Sie, das Platform-Ziel für Ihr Projekt auf x86 zu ändern, anstatt auf "Any cpu".

0

In meinem Fall, wenn wir eine Website mit offenen ssl entwickeln auf x64-2008-Plattformen zu gewinnen, müssen wir mit Anwendungspool überprüfen: allow 32 Anwendungen: true

enter image description here