C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

dllの参照方法


(過去ログ 8 を表示中)

[トピック内 24 記事 (1 - 20 表示)]  << 0 | 1 >>

■9291 / inTopicNo.1)  dllの参照方法
  
□投稿者/ xuexue 二等兵(6回)-(2006/12/18(Mon) 12:20:07)

分類:[C#] 


分類:[C#] 

お世話になります。
いつも勉強させていただいています。

さて、早速質問なのですが・・
/開発/ソース/hoge.cs  から
/本番/COM/foo.dll   を参照して使用しています。

これをコンパイルすると、
/開発/ソース/hoge.exe とセットで、foo.dllのコピーが出来ます。
飽くまで
/本番/COM/foo.dll
を参照させたいので、ローカルコピーをしない設定にすると、
foo.dllが参照できずに、コンパイルエラーになります。
かといって、絶対パスを指定する方法が見つからずに困っています。
C#って、どうして、絶対パスで参照せずに、デフォルトで
いちいちコピーする設定にしてるのか凄く疑問なのですが・・。

開発環境は
XP ProSP2 で .NET2003 を使用しています。

わかる方、ご教示お願いいたします。

0
引用返信 編集キー/
■9293 / inTopicNo.2)  Re[1]: dllの参照方法
□投稿者/ 囚人 伍長(56回)-(2006/12/18(Mon) 12:55:05)

分類:[C#] 

foo.dll に厳密名をつけて、GAC に入れてあげれば可能です。

GAC に入れなくても、全く無関係のディレクトリに入れる方法もあるようですが、詳細はよく知りません。
http://msdn2.microsoft.com/ja-jp/library/yx7xezcf(VS.80).aspx

0
引用返信 編集キー/
■9297 / inTopicNo.3)  Re[2]: dllの参照方法
□投稿者/ 黒龍 一等兵(28回)-(2006/12/18(Mon) 14:36:50)

分類:[C#] 

ローカルコピーをしない方法ですがソース管理でリンクやジャンクション(?)を作成することによって可能にはなりますがデメリットのほうが大きいと思います。(一括チェックアウトが出来なくなるなど)
諸々のデメリットに目を瞑るというのであればビルドイベントでコピーするなどすれば絶対パスでの指定も可能だと思います。
(プロジェクト参照なり、ローカルコピーなりのほうがおススメですが・・・)

0
引用返信 編集キー/
■9298 / inTopicNo.4)  Re[3]: dllの参照方法
□投稿者/ xuexue 二等兵(8回)-(2006/12/18(Mon) 14:49:09)

分類:[C#] 

囚人 様
黒龍 様

ありがとうございます。
>囚人 様
参考にさせていただきます。
GACの登録に関して、わからない点が明確になったら、またご相談させていただきます。
ありがとうございました。宜しくお願いいたします。

>黒龍 様
まだ、黒龍様の話が充分に理解できる知識やスキル経験がないようです。
お話を聞いても、ローカルコピーの有用性がわからないままです。
勉強しなおします。ありがとうございました。

0
引用返信 編集キー/
■9300 / inTopicNo.5)  Re[2]: dllの参照方法
□投稿者/ xuexue 二等兵(10回)-(2006/12/18(Mon) 15:44:35)

分類:[C#] 

No9293に返信(囚人さんの記事)
> foo.dll に厳密名をつけて、GAC に入れてあげれば可能です。
>
> GAC に入れなくても、全く無関係のディレクトリに入れる方法もあるようですが、詳細はよく知りません。
> http://msdn2.microsoft.com/ja-jp/library/yx7xezcf(VS.80).aspx

私がやりたいことは、お客様からもらったdll群が入ったディレクトリを
直接参照してアプリを動かすことです。
dll群のパスは決め打ちなので、「絶対パスで参照すれば問題ないじゃん」と思っています。
参照設定とかせずに、直接プログラムに書き込んでも問題ないのであれば、そうしてもいいくらいです。
アプリケーション設定ファイルに書き込めば良いというQ&Aサイトも見つけましたが、そのファイルがどれなのか、どこにどう書けばいいのかも、わかりません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7180&forum=7

GACや厳密名について、VSのヘルプや他のサイトを見てみましたが、解説が難しすぎて、作業方法の整頓すら出来なくなってしまいました。
using System.* などが、このGACで解決されているためにローカルコピーされずに済んでいることはわかりました。

以下、確認なのですが・・・
・Dllに対して厳密名をつけてGACに登録する必要がある(*1)
・GACに登録するということは、所定のフォルダにdllファイルをコピーするということ
 %windir%\assembly\ 内?
・囚人 様は、このフォルダを任意のパスにすることはできないとおっしゃっている
この認識があっていたとすると、私がやりたいことは実現できないと解釈します。
仮に、任意のパスのdllを厳密名として登録し、プログラムがdllの存在場所を特定できるならば、GACに登録することで、私がやりたいことが実現できそうですが、*1の作業内容が明確に理解できていません。


こちらの研究不足が目立つ質問ではありますが、追ってご教示賜りたく宜しくお願いいたします。
ローカルコピーせずに、ズバッとそのdllの場所を教えてあげるだけなのに、何でこんなに遠回りしなければならないのかと、つくづく不思議でなりません。

0
引用返信 編集キー/
■9301 / inTopicNo.6)  Re[3]: dllの参照方法
□投稿者/ はつね 一等兵(25回)-(2006/12/18(Mon) 16:30:44)
はつね さんの Web サイト

分類:[C#] 

No9300に返信(xuexueさんの記事)

> ローカルコピーせずに、ズバッとそのdllの場所を教えてあげるだけなのに、何でこ
> んなに遠回りしなければならないのかと、つくづく不思議でなりません。

本番のときにexeはどこに置きますか?
ローカルCOPYされてしまうのは、実行環境でEXEとDLLが同じフォルダにあるはずだという認識で探し始めるからです。そのため、GACじゃなければ、開発環境下でもEXEとDLLを同じフォルダにいれるためにローカルCOPYされるのです。

それでは例えば、/本番フォルダに置いたときに/本番/COMフォルダの中のDLLを探すにはどうしたらいいでしょうか。その場合は、app.configにDLLに対する相対パスを記述してDLLの位置を指定します(../DLLのように)。
詳しくは、http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_03/idnfw11_03_03.html
あたりを読んでみて下さい。

ただ、私としては、EXEとDLLを同じフォルダに入れるのがお勧めです。



0
引用返信 編集キー/
■9310 / inTopicNo.7)  Re[4]: dllの参照方法
□投稿者/ Jitta 大尉(177回)-(2006/12/18(Mon) 21:50:34)
Jitta さんの Web サイト

分類:[C#] 

 「なぜ、同じディレクトリにコピーされるのか」、ということを、考えてみられましたか?

 DLL Hell という言葉をご存じでしょうか。同じ名前の DLL なんだけど、バージョンが違うとインターフェイスが動作が変わり、バージョンの管理を厳密にしなければ、バグが大量発生してしまう…という、過去の事例があります。
 .NET Framework では、これに対応するために、DLL にバージョン情報を持たせ、特定の実行ファイルには特定のバージョンの DLL しかロードしないようになっています。

 まず、この仕組みが絶対です。その上で、どの様に管理するか。提供される DLL にインターフェイスや動作の違いがないことをどの様に保証するか。そのようなことを吟味した上で、配置/参照する方法を決めることを勧めます。

0
引用返信 編集キー/
■9313 / inTopicNo.8)  Re[5]: dllの参照方法
□投稿者/ 中博俊 神(872回)-(2006/12/18(Mon) 22:04:58)

分類:[C#] 

とりあえず、
・GACに入れる
・EXEの配下のディレクトリに入れる。
が不可能なら無理やりバイナリで読み込む。オンメモリで展開してアセンブリに読み込ます。なんてことを普通にできなきゃ無理です。

とにかく以前のDLLのような適当な共有フォルダ方式はできないと思ってください。

0
引用返信 編集キー/
■9314 / inTopicNo.9)  Re[4]: dllの参照方法
□投稿者/ 囚人 伍長(57回)-(2006/12/18(Mon) 22:06:35)

分類:[C#] 

まず、確認しておかねばならない事は「お客様からもらったdll群」に厳密名が付いているかどうかです。
厳密名がついていないとプライベート配置以外できません。諦めましょう。
まぁまともな開発者ならば厳密名を付けている筈なので、話を進めます。

厳密名が付いているアセンブリならば、プライベート、GAC、さらに任意のディレクトリに配置できるはずです。
あいにく私は任意のディレクトリに配置するやり方をした事がありませんので、誤った説明があるやもしれない事をご容赦下さい。

任意のディレクトリに共有DLLを配置して、アプリケーションの構成ファイルの codebase 要素にそのディレクトリのパスを書いてください。

0
引用返信 編集キー/
■9315 / inTopicNo.10)  Re[6]: dllの参照方法
□投稿者/ 囚人 伍長(58回)-(2006/12/18(Mon) 22:31:00)

分類:[C#] 

そもそも、多数のアプリケーションから参照されるアセンブリでない限り、プライベート配置にするのが普通です。そうでなければ、インストールとアンインストールが面倒になります。
何故、プライベート配置される事を嫌うのでしょうか?

0
引用返信 編集キー/
■9318 / inTopicNo.11)  Re[7]: dllの参照方法
□投稿者/ なちゃ 二等兵(16回)-(2006/12/19(Tue) 00:05:56)

分類:[C#] 

指定のディレクトリをなめてLoadFromっていう
とんでもなくお勧めできない方法もあったりします。
ええ、とんでもなくお勧めできないので基本的にやっちゃいけません。


0
引用返信 編集キー/
■9319 / inTopicNo.12)  Re[8]: dllの参照方法
□投稿者/ なちゃ 二等兵(17回)-(2006/12/19(Tue) 00:21:51)

分類:[C#] 

No9318に返信(なちゃさんの記事)
> 指定のディレクトリをなめてLoadFromっていう
> とんでもなくお勧めできない方法もあったりします。

あ、いやこれだと静的に参照してたらアウトだったかな…うろ覚え。


0
引用返信 編集キー/
■9322 / inTopicNo.13)  Re[9]: dllの参照方法
□投稿者/ 黒龍 一等兵(29回)-(2006/12/19(Tue) 09:59:56)

分類:[C#] 

> 何故、プライベート配置される事を嫌うのでしょうか?
おそらくですが僕の書き方が悪かった&GACを勧める方多数なのでだと思います。
GACでは特定バージョンへの固定がされたはずなのでそもそも要望を満たさない気がしておりますが…。

0
引用返信 編集キー/
■9337 / inTopicNo.14)  Re[10]: dllの参照方法
□投稿者/ とっちゃん 伍長(57回)-(2006/12/19(Tue) 14:56:31)
とっちゃん さんの Web サイト

分類:[C#] 

どこぶら下げるか迷ったんですが...

もらったものは、GACへのインストールをしてくれるインストーラはついてないんですよね?
なら、GACは候補から外してください。
もらったものを勝手にGACに入れるなんざ、御法度です。
#外に出ない場合を除く

気になるのは、/COM/... となってる名前。
COMが、Component Object Model を意味するのであれば、
インストーラあるはずなんで、それを使って開発環境に「インストール」してください。
単に、コンポーネントとしてそういうフォルダ名にしてるだけならいいんですが...

あとは、提供元にきちんと使い方を教わってください。
ここで聞いてても埒あかないというより、誰も解決できないですよ。


0
引用返信 編集キー/
■10262 / inTopicNo.15)  Re[11]: dllの参照方法
□投稿者/ xuexue 二等兵(11回)-(2006/12/28(Thu) 17:53:59)

分類:[C#] 

>皆様

お礼を申し上げるのが、大変遅れてしまいました。
問題は解消しましたが、技術知識面で解消されることはありませんでした。

基本的には、私の勉強不足が原因です。
コレを読まれたら顔をしかめられる方もいらっしゃるかもしれませんが、
ちゃんと整頓しておきたいので、私の今のイメージを申し上げます。

非常に素人的な発想です。

例えば、あるexe群があり、それらがdllを使用しているとしますよね。
1.exeも2.exeもa.dllを使用しているとします。
そして、1.exeと2.exeのパスが動的など、不確定な場合、a.dllがどこにあるか
わからなくなってしまいますよね。

これは、ウェブページとその中に貼付けられる画像のような関係に捕らえています。
この例えで言うと、動的なパスで管理されている複数のページが画像を参照
しようとするとき、絶対パスまたは、相対パスで参照させるはずです。
画像入れ替えのとき、一回で済むし、同意義のファイルが散在しなくて済む
からです。
ウェブページが動作するたびに、画像を、ウェブページと同じパスに持ってくる
という動きは非常にナンセンスに思えます。

皆さんのお話をお伺いしていると、どうやら、私のイメージの仕方が悪かった
のでしょうけど、そんな状態なので、なんでローカルにdllがおりてきちゃうのか
疑問でなりません。
だって、dllがバージョンアップしたら、いちいち配置してあげないと・・ですよね。

このあたりの疑問にお答え頂ける方、申し訳ありませんが、簡単なたとえ話でも
あれば、何とか理解できると思うのですが、宜しくお願いいたします。

0
引用返信 編集キー/
■10270 / inTopicNo.16)  Re[12]: dllの参照方法
□投稿者/ はつね 一等兵(33回)-(2006/12/28(Thu) 19:46:15)

分類:[C#] 

No10262に返信(xuexueさんの記事)
> このあたりの疑問にお答え頂ける方、申し訳ありませんが、簡単なたとえ話でも
> あれば、何とか理解できると思うのですが、宜しくお願いいたします。

.NETでは、exeとdllを同じフォルダに入れるか、GACとしてDLLの位置を覚えさせるかのどちらかの方法を基本にしているからです。これは決まりだから納得できるかどうかの問題ではなく、そういうものなのですとしか説明のしようがないです。
dllをバージョンアップしたらexeとdllを同じフォルダにいれてあげるか、GACに登録(この場合、バージョンごとに別保存になります)かです。

なお、exeとdllを同じ位置に配置するときであれば、実行時環境が立ち上がるときにdllをexeと同じ場所に自動COPYするので配置の手間はありません。

0
引用返信 編集キー/
■10274 / inTopicNo.17)  Re[13]: dllの参照方法
□投稿者/ 囚人 軍曹(61回)-(2006/12/28(Thu) 21:10:40)

分類:[C#] 

> xuexue さん。

「出来る」と私は2度も書いてますが、読んでいただけましたでしょうか。

但し、「プライベート配置以外の DLL」には「厳密名」が付いている必要があります。その場所をアプリケーションの構成ファイルに書いてあげればできます。GAC に入れれば構成ファイルに書く必要もなく参照できます。それだけです。

何故、厳密名が付いている必要があるかというと、皆さんが言われているように DLL 地獄の防止のためです。プライベート配置は DLL 地獄の心配がないので、別に厳密名が付いている必要はないという事です。

0
引用返信 編集キー/
■10278 / inTopicNo.18)  Re[13]: dllの参照方法
□投稿者/ はつね 一等兵(34回)-(2006/12/28(Thu) 23:13:21)
はつね さんの Web サイト

分類:[C#] 

No10270に返信(はつねさんの記事)
> なお、exeとdllを同じ位置に配置するときであれば、実行時環境が立ち上がると
> きにdllをexeと同じ場所に自動COPYするので配置の手間はありません。
    ↓
実行時環境ではなく開発時環境(IDE)の間違いです。

0
引用返信 編集キー/
■10280 / inTopicNo.19)  Re[14]: dllの参照方法
□投稿者/ 黒龍 一等兵(33回)-(2006/12/28(Thu) 23:43:46)

分類:[C#] 

> だって、dllがバージョンアップしたら、いちいち配置してあげないと・・ですよね。
バージョンアップ時の対応(=特定バージョンとの結び付けをしない)ということは可能です。(参照時の設定になります)
相対パス、絶対パス…という話ですが共有フォルダやジャンクションの作成などこちらも可能な設定です。
また、例としてインターネットの画像の話が挙げられていましたがネットワーク越しのdll参照もまた可能です。
と、このように.NetFramework自体の対応状況というのは多岐にわたっているので質問にあるような特定のケースを想像して当てはまらない=機能不足というのは早計な気がします。へんな先入観を持たずにいろいろ調べられてはいかがでしょうか?

0
引用返信 編集キー/
■10307 / inTopicNo.20)  Re[15]: dllの参照方法
 
□投稿者/ たろう 二等兵(6回)-(2006/12/29(Fri) 09:31:53)

分類:[C#] 

はじめまして。
すみませんが、同じようなところで悩んでいるので、便乗させてください。
私も、サーバ上にexeとdllを配置し、そこからの配布を行います。


各クライアントへの配布の際ですが、クリックワンスを使用しようか迷っております。
本当は、ノータッチデプロイメントのように、exeへのリンクを示すだけで、
初回のインストール画面を出さずに開始したいのですが、
そのようにしますと、GACへの登録という方法をとることになってしまうんですよね?


クリックワンスでの配布でしたら、exeとdllを配布し、動作確認もとれています。
これが皆さんが言われている、
@[exeとdllを同じフォルダにいれてあげる]
の方法のひとつで宜しいでしょうか?

これに対して、
A[GACに登録]
は、いくつかのサイトを拝見したところあまり推奨されておりません。
その理由としましては、dll地獄がよくあげられており、
その対応として、厳密名をつけるということで宜しいでしょうか?
その他推奨されていない理由がありましたら教えていただきたいです。

その他、なちゃさんが記述されているLoadFromなどの方法もありますが、
これもやらない方良いということですよね?
使用してみたところ、特に問題点は感じられなかったのですが、
これをやってしまうと、どのようなことになるのか教えていただきたいです。

以上宜しく御願い致します。

0
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -