2017-03-02 9 views
0

私は、C#用に64ビットと32ビットのDLLを持つSourceForgeのPlanEphからパッケージをダウンロードしました。 Visual Studio 2015 Communityを使用しているbin/DebugディレクトリにDLLを置いてDLLを参照として追加することで、32ビットのC#デモが動作するようになりました。予期しないSystem.DllNotFoundException

私は別のソリューションでデモの独自のバージョンを作成しようとし、System.DllNotFoundExceptionを取得しました。いろいろな実験によって、私のVisual Studioインストールのどこにでも2つの同一の名前空間名を持つことができないと私は思っていました。

私はディレクトリC \ GJAbinを作成し、その中にDLLを入れ、それをシステムパス変数に追加しました。私はまた、そのディレクトリにhelloWorld型プログラムを置いて、実際にそのディレクトリにあることを確認するためにコマンドラインから実行しました。その後、デモソリューションを再作成し、DLLをリソースとして追加し、ソリューションを「正常に」構築しました。その後、私はそれを実行し、System.DllNotFoundExceptionを取得しました。

コンパイル時にDLLが見つかった理由はわかりませんが、実行時には理解できません。

+0

.netフレームワークのバージョンである可能性があります。新しいプロジェクト.netフレームワークのバージョンがパッケージのバージョンと同じかそれより高いことを確認する必要があります。 –

+0

.netフレームワークのバージョンが間違っていた場合、それは一度働いて以来、私はフレームワークのバージョンはOKだと思う。また、今年はVisual Studioが再インストールされました。 –

答えて

0

プロジェクト設定に移動し、[公開]タブに移動し、一番上のボタン(「アプリケーションファイル」など)に移動します。 DLLが表示されない場合は、[すべてのファイルを表示]チェックボックスをオンにします。 DLLのパブリッシュステータスを "Include"(NOT "Include(Auto)" !!)に設定し、再度パブリッシュします。

ここで、DLLはパブリッシュフォルダ内にある必要があります。

+0

申し訳ありませんが、あなたの説明では、あなたが説明しているチェックボックスを見つけるのに十分ではありません。私はVisual Studioより天文学についてもっと知っていることを理解しています(プログラムのトピックです)。 –

+1

あなたのプロジェクトを右クリック - >プロパティ - >ターゲットフレームワーク –

+0

サギレヴィ、ターゲットフレームワークは4.5.2です。私の理解は、私のプログラム>のターゲットフレームワークがDLLのターゲットであればOKであるはずです。そして私が言ったように、それは一度働いた、そしてそれは昨日だった。 –

0

コンパイル時にDLLが見つかった理由はわかりませんが、実行時には見つかりません。

コンパイル時のアセンブリの位置付けは、実行時(CLRによる)と(MSBuildによって)異なる方法で行われます。

コンパイル時に、MSBuildには既知の特定の検索パスがあります。ほとんどの場合、これはプロジェクトファイルにMSBuildにファイルの場所を示すものがあります。通常<Reference><HintPath>です。

実行時に、CLRは、独自の既知のパスのセットからアセンブリを検索しようとします。アプリケーションの設定ファイル(該当する場合)、グローバルアセンブリキャッシュ(GAC)、次にアプリのルートディレクトリに表示されます。これに関する詳細はhereです。

MSBuildに、ビルド出力ディレクトリ(通常は実行時のアプリケーションのルートディレクトリと同じ)への参照をコピーするように指示できます。 VSでは、参照を選択してプロパティツールウィンドウを表示するか、デフォルトでF4を押して、これを行うことができます。 CopyLocal状態をTrueに設定します。プロジェクトファイルでは、<Reference><Private>True</Private>が追加されます。

gacutilツールを使用してアセンブリをGACに追加することもできますが、他のユーザーとアプリケーションを共有したい場合は、これが難しくなります。通常は、アプリのルートディレクトリにコピーを保存することをお勧めします。

まだ動作していない場合は、ランタイムがこのアセンブリを見つけようとしている方法のログも表示されます。 Windows SDKのfuslogvw.exeツール(これはVSコマンドプロンプトから実行でき、%PATH%にあります)を使用すると、アセンブリの読み込みのログを有効にすることができます。これを管理者として実行して設定を行う必要があります。

Settings from fuslogvw

あなたはスクリーンショットで見ることができるように、あなたは例外で結果をログに記録するか(デバッグ中にあなたがそれを見ることができるように)、またはあなたは、ディスク上のファイルにログインすることができます(だからいつかそれを見ることができます)。

+0

コピーローカルをチェックしました。本当。私はdllが私の... \ Projects \ Demo32 \ Demo32 \ bin \ Debugに存在することを発見しました。確かに、私はそれを取り除き、ビルドをやり直しました。もちろん、... \ bin \ Debugにdllの新しいコピーがありました。私は少し後でfuslogvwを見ます。 –

+0

私はファイルへのロギングを試してみましたが、.pdbファイルがありましたが、その種のファイルの表示方法はわかりません。 –

+0

カスタムログパス(フォルダにする必要があります)を設定した場合は、そこに適切なファイルを取得する必要があります。個人的には、例外テキストを使用してデバッガで見ます。 * .pdbファイルは、実行可能ファイルのデバッグシンボルであり、探しているログファイルではありません。 – Jimmy

0

問題は、著者が名前を選択した方法とVisual Studioで情報とエラーメッセージが表示される方法の間に不幸な相互作用があることが判明しました。作者は名前空間PlanEph32を含んでいるC#dll Astronomy.PlanEph32.dllを作成しました。これは実際にはdll PlanEph32.dllのラッパーでした。 PlanEph32.dllを読み込めないというエラーメッセージは、c dllが見つからないことを示しています。 C#のDLLはうまく見つかりました。

関連する問題