- 締切済み
意味不明の実行時エラーで困っています
作成したC#プログラムをコマンドプロンプト上でコンパイルし、実行すると下記のエラーが発生し、途方に呉れております。どうか原因と対策を教えてください。 エラー内容「例外発生(Main)ファイルまたはアセンブリ 'MyClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 場所 test09.test09.WinForm..ctor() 場所 test09.test09.Main()」 このC#プログラムは、まずクラスライブラリ(MyClassLibrary1)をVisualStudio上で作成し、次にそのテスターを同じくVisualStudio上で作成し動作確認をした後、そのテスターをコピーして新しいプログラムとして、今度はコマンドプロンプト上でコンパイルしたものです。この時の参照設定は「/r:Microsoft.VisualBasic.dll,MyClassLibrary1.dll /lib:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,C:\MyClassLibrary1\MyClassLibrary1\bin\Release」としました。コンパイルエラーは一切ありません。 何故VisualStudio上でうまく動作するものを、コマンドプロンプト上でやり直すのかには、それなりの理由があるのですが説明は文字数制限で省略いたします。必要とされている事とご理解ください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
大前提ですが,アプリケーション構成ファイルを利用する方法は避けられるなら避けることをお勧めします。 扱いが非常に面倒です。 # 厳密名付きのアセンブリであれば面倒であっても意味があるので,避けない,という選択肢が存在しますが。 今回の場合は厳密名が付いていないので,アセンブリをおける場所が非常に限られます。 まず,おける場所は.exeと同じディレクトリか,その配下ディレクトリになります (仮に,LibraryDirとします)。 次に,アプリケーション構成ファイル (*.exe.config) に,以下の記述のどちらかを追加します (既存の場合はマージすること)。 a.) dependencyAssembly要素を利用 <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="MyClassLibrary1" /> <codeBase href="LibraryDir/MyClassLibrary1.dll" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> b.) probing要素を利用 <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="LibraryDir" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> これによって,前者ではMyClassLibrary1を探す場所が変化し, 後者ではすべてのアセンブリについて,.exeと同じディレクトリ以外の場所も探すようになります。 どちらの方法も,.exeと同じディレクトリ以下のみを探せることに注意してください。 なお,ライブラリに厳密名を付けていれば,a.の方法を使うことで,どこにでも置くことができます。 <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="MyClassLibrary1" culture="neutral" publicKeyToken="a1238fd2b18ca30e" /> <codeBase version="1.0.0.0" href="file://localhost/C:/MyClassLibrary1/MyClassLibrary1/bin/Release/MyClassLibrary1.dll" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> MSDN: 厳密な名前付きアセンブリ http://msdn.microsoft.com/ja-jp/library/wd40t7ad.aspx MSDN: 方法 : アセンブリに署名する (Visual Studio) http://msdn.microsoft.com/ja-jp/library/ms247123.aspx
- Yune-Kichi
- ベストアンサー率74% (465/626)
/libはコンパイルにアセンブリを検索する場所を指定するものであって,実行時には全く別の方法でアセンブリが検索されます。 アプリケーション構成ファイル (app.config) まわりの話がわからないのであれば,とりあえず, 「.NET Frameworkに標準で含まれない全ての.dllは.exeと同じディレクトリにおく」 と思ってください。 一般的にはこの認識で十分です。 結論としては,MyClassLibrary1.dllと実行アセンブリを同一ディレクトリにおくようにしてください。 これで実行できるようになるはずです。
補足
質問者の私の無知にも関らず、優しく即答を頂くことができ、まことにありがたく感謝いたしております。 お教え頂きました「取敢えず対策」(MyClassLibrary1.dllを実行アセンブリと同一ディレクトリにコピーする方法)で、実行してみました。結果は上々で、目的プログラムが問題なく起動し、意図通りに動作することが確認できました。ありがとうございました。 ところで直接参照できる方法は難しいのでしょうか? 出来れば直接参照で実施してみたいと願っているのですが私には無理でしょうか? もしそうでなければ、お忙しいのに無理な注文ばかり申し上げて申し訳ありませんが、コマンドシンタックスを教えて頂けないでしょうか?
- Yune-Kichi
- ベストアンサー率74% (465/626)
アセンブリの検索位置に,MyClassLibrary1.dllは存在しますか。 MSDN: ランタイムがアセンブリを検索する方法 http://msdn.microsoft.com/ja-jp/library/yx7xezcf.aspx Visual Studioは参照設定されていて,ローカルコピーがTrueのアセンブリをアセンブリをビルドした先へコピーしますが, コマンドラインからビルドした場合はそれはおこなわれません。 このため,アプリケーション構成ファイルのdependencyAssemblyやprobingが適切に設定されていない場合,システムはアセンブリを見つけることができません。
補足
早速のご回答を頂きまして誠にありがとうございます。 確かにMyClassLibrary1.dllは「/r:以下」で指定した場所に存在しております。ご指摘を頂きました「コマンドラインからビルド時に必要なアプリケーション構成ファイルのdependencyAssemblyやprobingが適切に設定されていない場合」については、私には初めてお聞きすることであり、具体的にどのように設定すれば良いのか判らず途方にくれております。お忙しいところ誠に申し訳ありませんが、その方法を教えて頂けないでしょうか? 更に申し訳ないのですが、添付頂きましたURLにアクセスして読んでみましても、良く理解できないでおります。どうかよろしくお願いいたします。
お礼
度々面倒なことをお願いしたにも関らず、辛抱強くご丁寧な回答を頂きまして、心底、感謝いたしております。お陰様で見通しが付き気持ちがすっかり前向きになることができました。本当にありがとうございました。 お教え頂いた手続きをすぐに応用するには、私には難しすぎて時間が掛かりそうなので、今回頂いた回答を理解するための勉強を続けるすることにして、当面は先に頂いたコピー方法で進めて参りたいと考えております。そして理解が進みましてから再度、今回教えていただいた手法を応用して完成させる所存です。その節は又お世話になるかも知れませんが、どうかよろしくお願い申し上げます。ありがとうございました。