November 01, 2004
アセンブリを参照するには'dll'拡張子を指定する必要があります。
VS.netでプロジェクト間の参照をさせようとした。つまりあるシステムをプロジェクトAとプロジェクトBという2つのプロジェクトに分けて別々に開発していたのだが、途中で2つのプロジェクトをマージして、プロジェクトAからプロジェクトBを参照し相手の機能を呼び出す形で実装したほうがスマートだということに気付いたのでそうしようとしたのだ。
さっそく2つのプロジェクトを束ねるソリューションを作成し、その中にプロジェクトA&Bを入れた。そしてソリューションエクスプローラからプロジェクトAを選択し、右クリックで[参照設定]->[参照の追加]を選び、プロジェクトBを追加してOKボタンを押したら怒られた。
「(プロジェクト名)への参照を追加できませんでした。アセンブリを参照するには'dll'拡張子を指定する必要があります。」
わけわかめ。解決策を求めてにょろにょろとあちこちを調べてみると、どうもプロジェクトBのアウトプットをexeファイルにしていたのがいけなかったらしい。プロジェクト間の参照をするには、参照される側のプロジェクトがdllをアウトプットするように設定しておかなくてはならないようだ。ふうん。プロジェクトのアウトプットを変更するには、ソリューションエクスプローラからプロジェクト名を右クリックし、プロジェクトのプロパティを開く。そして[共通プロパティ]->[全般]->[アプリケーション]->[出力の種類]を「クラスライブラリ」に変更すればおっけー。exeではなくdllを吐くようになる。これでプロジェクト間の参照が通るようになった。めでたしめでたし。
dllじゃなくちゃダメ、というのは、確かに言われてみるとそんなものかと何となく納得してしまうのだが、C/C++に慣れ親しんできた身からするとちょっと違和感がある。C/C++だとソースコード間の参照に通常includeディレクティブを使うので、ソースコードのレベル(コンパイルされる前の段階)で参照が行われるというのが自然な感覚だ。なので、出力がexeかdllかなんてのにいちいち煩わされるのは変な感じがする。このあたり、もっと.NETのことを知れば納得できるのだろうが。マイクロソフトプレスの.NET framework本を読んでみようかなあ。買ったきり積ん読になってるあれを。
Trackback
You can ping this entry by using http://windy.ac/MT/mt-tb.cgi/605 .
