2

MediaInfo.dllを使用してmkvファイルのビデオとオーディオ情報を読み取るプログラムを作成しました。

プログラムは、dllがbinフォルダーに配置されている状態で、ソースから実行すると完全に機能します。

今、私は自分のアプリを公開して、それを使い続けることができるようにしたいと思っています。MediaInfo.dllライブラリが見つかりません。運が悪かったので入れてみましたC:\WIndows\C:\Windows\system32(公開後に)セットアップを実行すると、プログラムは同じ場所にインストールされます(これは望ましくありませんが、これは別の問題です)。dllもそのフォルダに入れてみました。

エラーをスローしているコードは次のとおりです。

try{
  Handle = MediaInfo_New();
}
catch (Exception ex){
                Handle = (IntPtr)0;
Console.Out.WriteLine(ex.ToString());
}

エラースローはSystem.BadImageFormatExceptionまたはSystem.DllNotFoundException: Unable to load DLL 'MediaInfo.dll'です。

dllを配置する場所に関するアイデアはありますか?

4

2 に答える 2

4

EXEをコピーしたのと同じディレクトリにDLLを展開する必要があります。

64ビットバージョンのWindowsを起動するマシンにプログラムを展開しているため、BadImageFormatExceptionに問題があり、c:\ windows\system32が機能しないことがあります。ただし、プログラムを64ビットモードで実行することはできません。32ビットのネイティブコードに依存しています。プログラムを強制的に32ビットモードで実行することにより、これを修正する必要があります。EXEプロジェクトを右クリックし、[プロパティ]、[ビルド]タブで、プラットフォームのターゲット設定をx86に変更します。DLLをWindowsディレクトリにコピーすることは本当に悪い考えですが、そのようなマシンではc:\ windows\syswow64です。 EXEと同じディレクトリで、常にローカル展開を優先します。

この後もDllNotFoundExceptionに問題がある場合は、MediaInfo.dll自体が別のDLLに依存している可能性があります。これはかなり一般的ですが、Cランタイムを格納するDLLは非常に一般的な依存関係です。どのDLLであるかわからない場合は、SysInternalsのProcMonユーティリティを使用できます。プログラムがDLLを検索し、見つからないことがわかります。

于 2013-03-03T13:42:10.140 に答える
1

以下のいずれかを試すことができます-

1)MediaInfo.dllを実行可能ファイルと同じ場所に配置します。プログラムが適切なターゲット プラットフォーム用にビルドされていることを確認してください。通常、ターゲット プラットフォームとバイナリのアーキテクチャが一致していない場合 (x86 v/s x64)、BadImageFormatException が発生します。パッケージ化依存関係は、通常、これを処理します。

2)ターゲット マシンのグローバル アセンブリ キャッシュMediaInfo.dllに登録します。これは、インストーラーを介して、または単純にgacutil.exeを使用して実行できます。これにより、dll がターゲット マシン上のすべてのアセンブリから見えるようになります。

于 2013-03-03T14:16:52.357 に答える