ソリューション内のEXCELファイルへのアクセス方法

タグの編集
投稿者 刈谷勇  (社会人) 投稿日時 2008/10/17 03:45:41
Express Edition
現在、ソリューション内にWindowsアプリケーションとクラスライブラリーがあります。
クラスライブラリー内でExcelファイルを使う為に、既存のファイルでExcelファイルを追加し、プロパティの「出力ディレクトリーにコピー」を「新しい場合はコピーする」にしたのですが、このファイルにアクセスする方法がわかりません。
GetExecutingAssemblyでパスを取ってみたのですが、WindowsアプリケーションのDebugフォルダがかえってきてしまい、Excelファイルがおかれているクラスライブラリーのパスが取れません。
この場合、どのようにしてExcelファイルにアクセスすればいいのでしょうか?
投稿者   (学生) 投稿日時 2008/10/17 07:40:01
「Excelファイルがおかれているクラスライブラリー」とは何ですか?
「既存のファイルでExcelファイルを追加し、プロパティの「出力ディレクトリーにコピー」」したExcelのパスは
「GetExecutingAssemblyで取得したDebugフォルダのパス」で合ってますよ。(デバッグ実行時の場合のみ)

ちょっと何が問題なのか判らないので、もう少し詳しい状況説明をお願いします。
投稿者 刈谷勇  (社会人) 投稿日時 2008/10/17 20:49:33
あさん、回答ありがとうございます。

>「Excelファイルがおかれているクラスライブラリー」とは何ですか?

ソリューション内にWindowsアプリケーションとクラスライブラリーがあり、クラスライブラリー側でソリューションのメニューより「追加-既存の項目」でExcelファイルを追加しました。


>「既存のファイルでExcelファイルを追加し、プロパティの「出力ディレクトリーにコピー」」したExcelのパスは「GetExecutingAssemblyで取得したDebugフォルダのパス」で合ってますよ。(デバッグ実行時の場合のみ)

デバッグ実行の場合、クラスライブラリー側で「追加-既存の項目」ファイルを追加した場合は、クラスライブラリーのデバッグフォルダに追加されますよね?
でも、GetExecutingAssemblyだと、Windowsアプリケーションの方(スタートアッププロジェクト)がかえってくるため、そのフォルダにはExcelファイルが存在しないため、エラーになってしまいます。
プロパティの設定ミスかと思いいろいろいじって見ましたが、Windowsアプリケーションの方のフォルダにコピーされませんでした。
最悪は、Windowsアプリケーションの側にファイルを追加すればいいとは思うのですが、クラスライブラリーのみで使うファイルのため、できればクラスライブラリーの側に追加したいと思います。

つたない説明ですが、もしまだなにか不明な点がありましたら、再度質問ください。
投稿者 るしぇ  (社会人) 投稿日時 2008/10/18 02:21:48
クラスライブラリはDLLになりますよね?
それは実行ファイル(EXE)のフォルダかシステムフォルダに
登録される必要がありますよね?
http://msdn.microsoft.com/ja-jp/library/7d83bc18(VS.80).aspx

『クラスライブラリーのデバッグフォルダ』というのが
開発時のみの概念に思います。プログラム中で使える概念では
ないように思います。
むしろクラスライブラリの出力ディレクトリを実行ファイル(EXE)の
出力ディレクトリにすべき話では?

開発が終了してアプリケーションを他端末にインストールするって
なったとき、どこに置くつもりなんでしょうか???
投稿者 るしぇ  (社会人) 投稿日時 2008/10/18 02:45:05
一応、APIを使ったコードが引っかかったので
http://d.hatena.ne.jp/egggarden/searchdiary?word=dll
LoadLibraryEx と GetModuleFileName を使ってますねぇ。
投稿者 刈谷勇  (社会人) 投稿日時 2008/10/21 02:25:48
るしぇさん、回答ありがとうございます。

>むしろクラスライブラリの出力ディレクトリを実行ファイル(EXE)の
>出力ディレクトリにすべき話では?

別のシステムでも使うことを考えて、出力先はスタートアッププロジェクトの出力先とは分けてあります。
また、教えていただいたAPIのリンク先ですが、私のレベルではまだ理解できませんでした。こちらの方はゆっくり理解していきたいと思います。

変な考えをしている部分もあると思いますが、今回私が対応した方法を以下に書いておきます。
初心者がこんな考えをしているのかという参考にでもなれば・・・(^_^;



1. まず、GetExecutingAssemblyでパスをとったことで、クラスライブラリのDLLがスタートアッププロジェクトのbinにも作成されているということを認知。その前までは、クラスライブラリのbinの方のDLLを使用していると思っていました。ここで、「なんで、EXCELは出力ディレクトリーにコピーするを常にコピーするにしてもコピーされないのだろう??」と思う。(今もあまり釈然としない部分もありますが・・・)
2. ここで、「今、ソリューションの中に入れているけど、そもそも既に作成済みの場合は、参照の追加でDLLを指定するんだよなぁ・・・。あれ、その場合、EXCELのファイルはDLLを指定しただけで取り込まれるわけないよなぁ。ってことは、スタートアッププロジェクトに追加しないといけない。スタートアッププロジェクトに追加しておけば今の問題も解決するじゃん」ということで、スタートアッププロジェクトに追加することにしました。
3.その後、Clickonceでの配信方法をネットで調べて、ビルドアクションを「コンテンツ」にしています。

とりあえず、今はこんな感じで設定しています。
また、なにか問題がでましたら、別のスレにて質問をさせていただきます。

あさん、るしぇさん、ありがとうございました。