何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 29472
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

元ネタ:dllの参照方法

xuexueさん (2006/12/28(Thu) 17:53:59):

なんでローカルにdllがおりてきちゃうのか疑問でなりません。
だって、dllがバージョンアップしたら、いちいち配置してあげないと・・ですよね。

はぁ。。。

「DLL Hell」という言葉を、ご存じでしょうか。こいつを回避するため、.NET Framework では、複数のアプリケーションで共通して使う DLL は、Global Assembly Cache に登録するか、アプリケーションの実行ファイルがあるところにコピーするように、強く推奨されています。

では、DLL Hell とは、どんなものでしょうか。私の体験を、書きます。

1997年でしたか。あるプロジェクトで、DateTimePicker を使うことになりました。テキスト ボックスに年月日が出ていて、クリックするとカレンダーが出てくるヤツです。

これを使ってアプリを作り、「出来ました!」と、品質保証部へ回したところ、「カレンダーで、なんにも選ばずにカレンダーの外をクリックすると、アプリケーションが落ちるんだけど?」

いや、あの、その。。。それって、Borland から提供してもらっている部品なんで。。。早速 Borland へ問い合わせる。返事有り。「マイクロソフトが提供している部品なので、弊社では修正いたしかねます」・・・が~~~~ん!!

というわけで、元になる DLL を特定し、その DLL の、他のバージョンがないか、探す。

あった。「一太郎」についてきたものが、バージョンが新しい。

早速テスト。良好良好。

「修正しました!!」と、渡す。「この、日付のあるところで、IME をオンにして、キーボードの上に手を置く(複数のキーを同時に押す)と、アプリケーションが落ちるんだけど?」

え゛?!そんなテスト、するですか?

ってことで、さらに他のバージョンがないか、探す。あった。MS Office と共にインストールされるものが、さらに新しい。

早速入れ替えてテスト。同時押しは直っている。が。カレンダー外クリックが復活しているorz

結局。テキスト ボックスを3つ並べましたよ。UI の悪さより、安定性を選んだわけです。

数ヶ月後。Borland のサイトで、カレンダー外クリックの対処方法が書かれているのを発見。さらにへこむ。

・・・・・

まぁ、このときは、結局直らなかったわけですが。

一太郎バージョンで不具合が出ず、その状態で出荷したとします。後で顧客が MS Office をインストールしたら?また、不具合が発生するわけです。

このように、DLL のバージョンによって、あるアプリケーションの挙動が左右されるような状態。そんな状態に、好きこのんでなりたいですか?

このような状態を回避するため、.NET Framework では、DLL を実行ファイルがあるのと同じディレクトリにコピーするようにしました。こうして、アプリケーションと DLL が同時に更新されるようにすることで、あるアプリケーションのための変更が、他のアプリケーションへ害を及ぼすことを阻止できます。

そもそも、DLL とは、Dynamic Link Library、実行時結合型のライブラリです。コンパイル時に結合されるライブラリは、LIB という拡張子が付けられています。

静的にリンクすると、ローカルにコピーしたモノを使うのと同じで、特定のバージョンを使い続けることが出来ます。しかし、なぜ、動的に結合するものが必要なのか。

ディスク資源の節約です。共通のものは外に追い出し、都度都度参照することで、配布するときにその分の容量を減らすことが出来ます。

元々、ディスク資源を有効に使うために作った仕組みなのに、同じディレクトリにコピーしていては元の木阿弥です。なので、GAC に登録して、共通して使うことが出来るようにしてあります。

ところで、UNIX の世界にも静的ライブラリと動的ライブラリはあります。しかし、うろ覚えですが(指摘求む)、UNIX の場合、動的ライブラリには、拡張子の後にバージョン番号が追加されています。コンパイル時に、実行時に結合するライブラリのバージョンを指定することが出来るんですね。

マイクロソフトは、なぜこれをマネしなかったのか。なぜ今頃になって、ようやくマネをしたのか。

簡単です。ディスク資源が足りなかったのです。ファイル名も、8.3の 11文字しか使えなかったし。NTFS でファイル名の制限をなくし、ディスク資源が潤沢になった今になって、既存の Win32 アプリケーションに影響しない .NET Framework という別の基盤を使って、ようやくマネすることが出来るようになったのです。

しかし、GAC に登録するためには、バージョンを明確にしなければなりません。あと、署名も必要。なぜでしょうか。

出所のはっきりしない DLL を使って、本当に大丈夫なんですか?誰かが、同じ名前で、同じ関数を持つ、違う動きをする DLL を作って、こっそり配布したら、どうなりますか?

あるいは。本当に、「修正した」DLL が、他のアプリケーションでも使えるのですか?インターフェイスが変わったりしていませんか?少し古い開発者なら、SUCCESS の定義が変わってあたふたした憶えがないですか(私はこのとき、まだ UNIXer だったので、人ごとでしたが)。0 と定義されていた SUCCESS を、1、つまり true と同じにしたんですね、確か。これ、SUCCESS で見ていれば、コンパイルし直すだけで済みますが、0 や 1 をハードコーディングしていたら・・・

もう一度尋ねます。こんな体験、したいですか?

投稿日時 : 2006年12月29日 19:08
コメント
  • # re: なぜみんな、地獄を見たがるの?
    hirotow@霧島
    Posted @ 2006/12/29 21:02
    UNIXの共有ライブラリの説明をhttp://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/shared-libraries.htmlで見つけました
    あとご存知かもしれませんが、UNIXだと依存関係地獄というものがあります。
    最近はaptとかyumとか便利なものがありますが…
  • # Side-by-side を使う理由,Windows 2000 が死すべき理由,Web が既に死んでいる理由
    NyaRuRuの日記
    Posted @ 2006/12/29 21:31
    『何となく Blog by Jitta』より.DLL Hell へ向かうありがちな質問への回答. ところで、UNIX の世界にも静的ライブラリと動的ライブラリはあります。しかし、うろ覚えですが(指摘求む)、UNIX の場合、動的ライブラリには、拡張子の後にバージョン番号が追加されています
  • # re: なぜみんな、地獄を見たがるの?
    Jitta
    Posted @ 2006/12/31 21:10
    hirotow@霧島さん、コメントありがとうございます。
    NyaRuRuさん、トラックバックありがとうございます。

    > UNIXだと依存関係地獄というものがあります。
    これは、知りません。
     おそらく、今まで関わってきたシステムが、そのシステムのためにしか、コンピュータを使わないから、、、だと思います。
     今、お世話になっているところは、パッケージとも言えるソフトなので、DLL Hell にしろ、依存性地獄にしろ、気をつけないといけない・・・んだろうな。。。あまり実感無い(__;


    > DLL の Side-by-side (SxS) は別に .NET の専売特許というわけでもないですけどねぇ
    あれ?そういうふうに書いたつもりは、無いのですが。。。

    > Windows XP 以降の,manifest ファイルによる DLL のバージョン制御
    え!?出来るんですか?XP 用の、Win32 アプリは作っていないので。あ、C++ で MFC アプリを作るときになんか聞いてくるヤツ?あれか。
    今のプロジェクト、静的リンクしているので、全然、気にしてなかった(__;
  • # re: なぜみんな、地獄を見たがるの?
    NyaRuRu
    Posted @ 2007/01/01 12:09
    >> DLL の Side-by-side (SxS) は別に .NET の専売特許というわけでもないですけどねぇ
    >あれ?そういうふうに書いたつもりは、無いのですが。。。

    ああすみません.これは,

    >>>既存の Win32 アプリケーションに影響しない .NET Framework という別の基盤を使って、ようやくマネすることが出来るようになったのです。

    と書かれていた部分を受けてのものです..NET Framework は確かに SxS を意識して作られたフレームワークではありますが,かといって Win32 で SxS が利用できない / Microsoft に利用する気がないというわけでもないと.
    .manifest や Reg-Free COM はれっきとした .NET 以外の SxS テクノロジです.

    http://blogs.msdn.com/mgrier/archive/2005/06/18/430402.aspx
    にあるように,LoadLibrary の動作も XP 以前と以後で違うので,結構注意しないと嵌ります.
    以前日記で書いたものです.ご参考までに.
    http://d.hatena.ne.jp/NyaRuRu/20060715#p2
  • # re: なぜみんな、地獄を見たがるの?
    Jitta
    Posted @ 2007/01/02 13:57
    NyaRuRuさん:
    > Win32 で SxS が利用できない
     この部分は、これができたころには MS 製品を使っていなかったので、できないものだと思っていました。
     .manifest ファイルがあるので、「これ、なんに使うんだろう?」と思っていたのですが(中を見て、おおよそ見当はつけていましたが)、そのためのものだったのですね。
  • # re: なぜみんな、地獄を見たがるの?
    がる
    Posted @ 2007/01/09 1:51
    がるです。
    依存関連は、UNIXだとrpmが有名ですねぇ…多分(笑
    それはもぉ「蜘蛛の巣に絡めとられるような」素敵な感覚が味わえます。
    …だからrpm嫌いなのですが(苦笑

    ちなみに。知っている限りでは。UNIXだと、静的だろうが動的だろうが、ライブラリは全部、めぢゃぁまいなぁメンテナンスの各バージョン番号までがついてる実ファイルがあって。
    それをシンボリックリンクで…ってのが多いです。
    なので、最悪のケースでもそんなに苦労はしないですね。gccでコンパイルしなおせばいいだけなので。

    ただ…本気こいて基本的なもの以外は、ぶっちゃけ「コンパイル時に静的に縛るほうが」楽ではあるんですよね。
  • # re: なぜみんな、地獄を見たがるの?
    Jitta
    Posted @ 2007/01/10 19:45
    がるさん、コメントありがとうございます。

    > ぶっちゃけ「コンパイル時に静的に縛るほうが」楽ではある
    その為だと思うのですが、今関わっているものでは、静的にリンクしています。
    なんにしても、「他のアプリをインストールしたら動作がおかしくなった」とか、「アプリをインストールする順番によって動作が異なる」とかいうのは、避けたいわけで。
  • # re: なぜみんな、地獄を見たがるの?
    ちびまほうつかい
    Posted @ 2007/03/07 4:14
    最近プログラミングを始めた者です。

    すいませんがコマンドライン一発でマニフェストファイルを
    埋め込むような技は無いんでしょうか?

    たとえば、MyProg.exeとMyProg.exe.manifest
    にたいして

    > foo MyProg.exe MyProg.exe.manifest
    などと操作することにより統合できるなんていうことは
    無いんでしょうか?
  • # re: なぜみんな、地獄を見たがるの?
    Jitta
    Posted @ 2007/03/07 22:07
    ちびまほうつかいさん、こんにちは。

     ご質問は、「コンパイル(リンク)後の実行ファイルと、マニフェストの統合(埋め込み)」でしょうか。

     残念ながら、私は .NET から VisualStudio を触りだしたので、その辺は詳しくないのです。
     で、MSDN を「manifest 埋め込」(送りがなをつけないのがコツ)で検索して、ここを見つけました。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/235embmanifest/embmanifest.html

     これは、コンパイル時に埋め込みます。そのほかのリソースもざっと目を通しましたが、リンク時に埋め込むようです。MSDN ではここ。
    http://msdn2.microsoft.com/ja-jp/library/ms235591(VS.80).aspx
  • # re: なぜみんな、地獄を見たがるの?
    ちびまほうつかい
    Posted @ 2007/03/08 23:43
    情報どうもありがとうございました。
  • # re: なぜみんな、地獄を見たがるの?
    凪瀬
    Posted @ 2008/06/16 14:13
    フェンスの存在を知っていても、フェンスが建てられている理由を知らなければ「邪魔だからなければいいのに」と思うだけなんですよね…。
    別に好き好んで地雷原を歩きたいわけではないと思うけども。
  • # re: なぜみんな、地獄を見たがるの?
    カオス
    Posted @ 2011/03/19 13:40
    Webアプリケーションについては、似たような問題として、ブラウザ非互換がありますよね。
    今まで問題の無かったものが、ブラウザのバージョンが変わった事により、表示や動作が変わってしまうというものです。
    やりたいことは変わらないのに、今なおアホ供が永遠に続く地獄を量産してますね。(笑)
  • # re: なぜみんな、地獄を見たがるの?
    Jitta
    Posted @ 2011/03/20 16:10
    > ブラウザのバージョンが変わった事により、表示や動作が変わってしまうというものです。

    ああ、目が痛い目が痛い。
    いや、IE6, 7 だけ、動作が違う困った問題に、組み込み Linux の大元が変更できない(期間的、スキル的問題)ので、蓋をしたところですねんorz orz orz
  • # My brother recommended I might like this blog. He was entirely right. This publish truly made my day. You cann't imagine simply how a lot time I had spent for this info! Thanks!
    My brother recommended I might like this blog. He
    Posted @ 2021/08/30 5:28
    My brother recommended I might like this blog. He was entirely right.
    This publish truly made my day. You cann't imagine
    simply how a lot time I had spent for this info! Thanks!
  • # My brother recommended I might like this blog. He was entirely right. This publish truly made my day. You cann't imagine simply how a lot time I had spent for this info! Thanks!
    My brother recommended I might like this blog. He
    Posted @ 2021/08/30 5:30
    My brother recommended I might like this blog. He was entirely right.
    This publish truly made my day. You cann't imagine
    simply how a lot time I had spent for this info! Thanks!
  • # My brother recommended I might like this blog. He was entirely right. This publish truly made my day. You cann't imagine simply how a lot time I had spent for this info! Thanks!
    My brother recommended I might like this blog. He
    Posted @ 2021/08/30 5:31
    My brother recommended I might like this blog. He was entirely right.
    This publish truly made my day. You cann't imagine
    simply how a lot time I had spent for this info! Thanks!
  • # My brother recommended I might like this blog. He was entirely right. This publish truly made my day. You cann't imagine simply how a lot time I had spent for this info! Thanks!
    My brother recommended I might like this blog. He
    Posted @ 2021/08/30 5:32
    My brother recommended I might like this blog. He was entirely right.
    This publish truly made my day. You cann't imagine
    simply how a lot time I had spent for this info! Thanks!
  • # Good web site you've got here.. It's difficult to find high-quality writing like yours nowadays. I seriously appreciate individuals like you! Take care!!
    Good web site you've got here.. It's difficult to
    Posted @ 2021/09/02 21:19
    Good web site you've got here.. It's difficult to find high-quality writing like yours
    nowadays. I seriously appreciate individuals like you!
    Take care!!
  • # This is my first time pay a visit at here and i am truly impressed to read all at single place.
    This is my first time pay a visit at here and i am
    Posted @ 2021/09/05 21:25
    This is my first time pay a visit at here and i am truly impressed to read
    all at single place.
  • # This is my first time pay a visit at here and i am truly impressed to read all at single place.
    This is my first time pay a visit at here and i am
    Posted @ 2021/09/05 21:26
    This is my first time pay a visit at here and i am truly impressed to read
    all at single place.
  • # This is my first time pay a visit at here and i am truly impressed to read all at single place.
    This is my first time pay a visit at here and i am
    Posted @ 2021/09/05 21:27
    This is my first time pay a visit at here and i am truly impressed to read
    all at single place.
  • # This is my first time pay a visit at here and i am truly impressed to read all at single place.
    This is my first time pay a visit at here and i am
    Posted @ 2021/09/05 21:28
    This is my first time pay a visit at here and i am truly impressed to read
    all at single place.
  • # Hey there! This is kind of off topic but I need some guidance from an established blog. Is it difficult to set up your own blog? I'm not very techincal but I can figure things out pretty quick. I'm thinking about making my own but I'm not sure where t
    Hey there! This is kind of off topic but I need so
    Posted @ 2021/10/26 1:45
    Hey there! This is kind of off topic but I need some guidance from an established blog.
    Is it difficult to set up your own blog? I'm not very techincal but I can figure things out pretty quick.
    I'm thinking about making my own but I'm not sure where to start.
    Do you have any points or suggestions? Appreciate it
タイトル  
名前  
Url
コメント