9

編集(質問全体、それはあまりにも不明確でした)

OpenSSL.NETを使いたい

OpenSSL.NETのインストール手順ページ:インストール

アプリケーションの現在の作業ディレクトリまたはPATHにlibeay32.dllとssleay32.dllがあることを確認してください。完了
.NETプロジェクトで、ManagedOpenSsl.dllアセンブリへの参照を追加します。終わり

私は自分とディレクトリの両方にlibeay32.dllとを入れました。私もそれらを入れました。ssleay32.dllbin/Debugbin/Releasesystem32

これが私の完全なコードです:

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();
        }
    }
}

次のエラーが発生します: DLL'libeay32' をロードできませんhttp://localhostr.com/files/a719c5/Error.gif(DLL'libeay32'をロードできません)

プロセスモニターのログは次のとおりです(リクエストに応じて): alt text http://localhostr.com/files/726a46/ProcMon.gif

私は何が間違っているのですか?DLLが見つからないのはなぜですか?

4

12 に答える 12

4

OpenSSL.NETの最新バージョン(0.4.1)を試してください。これには、CRTに静的にリンクするビルド済みのlibeay32.dllおよびssleay32.dllバイナリが含まれているはずです。または、これらのライブラリを自分でビルドするか、openssl.orgの「公式」ビルドを使用することもできます。

于 2009-09-09T07:49:26.437 に答える
2

コードを正確に調べないと、次の場合にエラーが発生します。

  • 実行可能ファイルのパスにdllがありません(slnが存在する場所ではなく、.exeが作成される場所(通常はbin/debugまたはbin/x86 / debugなど)。
  • 呼び出し元の関数の適切な署名がありません(つまり、整数パラメーターを省略した、戻り値の型が一致しないなど)。
  • タイプを適切にマーシャリングしていません(つまり、BOOLはboolとしてマーシャリングされ、boolは符号なし1バイト整数としてマーシャリングされます)-この最後の1つは例外を引き起こさないかもしれませんが、明らかにファンキーな動作を引き起こす可能性があります。
  • 64ビットプラットフォーム上にあり、32ビットdllを呼び出しています。ポインタのサイズはすべて異なり、dllがクラッシュして、その例外が発生する可能性があります。

編集:他のすべてが失敗した場合は、依存関係ウォーカーを試してください。これは、dllがパスまたは実行可能ファイルのディレクトリにない他のdllを呼び出しているように見えるためです。

于 2009-09-08T20:29:40.263 に答える
2

まだこの問題が発生している(そして必要な前提条件が正しい場所に存在することを確認した)他の人の場合:

OpenSSL.NETのインストールドキュメントを確認し、その前提条件がインストールされていることを確認してください。私の場合、OpenSSL.NETドキュメントで呼び出されているMicrosoft Visual C ++ 2010再頒布可能パッケージ(x86)の依存関係がユーザーにありませんでした。

于 2013-03-06T21:04:33.093 に答える
1

プロービングを使用してみてください。アプリケーションの実行可能完全な名前として(または管理されていないdllを要求するアセンブリとして名前が付けられた)XML構成ファイルを.config拡張子で作成する必要があります。たとえば、アプリケーションの名前がmyapp.exeの場合、構成ファイルの名前はmyapp.exe.configになります。構成ファイルは、実行可能ファイル/アセンブリと同じディレクトリに配置する必要があります。

構成ファイルは単純なxmlファイルです。

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

これで、アプリケーションはアセンブリをロードするときにPATHを検索します。PATHは、構成/アセンブリファイルからの相対パスです。

管理されていないdllで機能するかどうかはわかりませんが、試してみる価値はあります。

于 2009-09-08T20:52:23.950 に答える
1

あなたの問題はこの質問に関連しています:

DllNotFoundExceptionですが、DLLがあります

すべての依存関係がアプリケーションの同じフォルダーにあるか、登録されているかを確認します。

于 2009-09-08T20:40:00.133 に答える
0

おそらくVC++再配布可能ファイルが欠落しています。OpenSSL.NETはx86のみであると想定しているため、リリースビルドの場合はVS2008バージョンx86の再配布可能ファイルを入手できます。

それ以外の場合、それらがデバッグビルドである場合(EventViewerまたはsxstraceログにMicrosoft.VC90.DebugCRTが表示されます)、次のいずれかを行う必要があります。

  • それらをリリースとして再構築します
  • 別のマシンからデバッグ再配布可能ファイルをインストールまたはコピーします
  • Visual C++をVisualStudio(またはおそらくVisual C ++ Express)にインストールします
于 2009-09-09T00:14:39.583 に答える
0

これを行う.NETの方法は、アセンブリをグローバルアセンブリキャッシュにインストールすることです。

共通言語ランタイムがインストールされている各コンピューターには、グローバルアセンブリキャッシュと呼ばれるマシン全体のコードキャッシュがあります。グローバルアセンブリキャッシュには、コンピューター上の複数のアプリケーションで共有するように特別に指定されたアセンブリが格納されます。

于 2009-09-08T20:28:19.967 に答える
0

最後の手段として、他に何も機能しない場合:

アプリケーション(.netかどうか)がDLLを探している場所を知っておくと便利な場合があります。プロセスモニターを使用して、DLLのファイル名をフィルター処理するだけです。次に、アプリケーションが探している場所にコピーします。

于 2009-09-08T21:01:44.047 に答える
0

私は解決策を見つけました。

残念ながら、VS2008C++再頒布可能パッケージは機能しませんでした-SP1バージョンとVC++2008をインストールする必要がありました。著者はそのウェブサイトのコメントで、それは私の側ではなく、その側の間違いであると述べました。彼は現在、静的にリンクされるようにDLLを再コンパイルしています。私を助けてくれたすべての人に感謝します:)

于 2009-09-09T23:07:00.733 に答える
0

プロジェクトのプラットフォームターゲットを「anycpu」ではなくx86に変更してみてください。

于 2010-05-11T11:59:12.827 に答える
0

私の場合、x64 win2008プラットフォームでopensslを使用してWebサイトを開発するときは、アプリケーションプールを確認する必要があります:32個のアプリケーションを許可する:true

ここに画像の説明を入力してください

于 2013-03-07T09:41:49.103 に答える
0

アプリケーションパスにx86という名前の新しいフォルダーを作成し、libeay32.dll、ssleay32.dllをx86フォルダーに配置します。

于 2019-01-04T12:57:00.220 に答える