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

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

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

visualstudio 参照設定の方法が間違っている?

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

■96897 / inTopicNo.1)  visualstudio 参照設定の方法が間違っている?
  
□投稿者/ ゆ (5回)-(2021/02/25(Thu) 12:43:34)

分類:[.NET 全般] 

2021/02/25(Thu) 12:46:10 編集(投稿者)

お世話になります。

visualstudioで開発したc#アプリケーションを、svnを使ってソース管理しています。

svnから最新ソースをチェックアウトし、ソリューションをビルドすると以下のエラーが生じました。
@「c:\usera\app\com\bin\debug\com.dll」メタデータが見つかりませんでした。
A「c:\usera\app\com\com.ico」を読み込み中にエラーが発生しました。

ソリューションの構成は
・com プロジェクト→dll
・main プロジェクト→メインアプリケーション
メインからcom.dllを参照設定しています。
メインのcom参照先のパスは「c:\usera\app\com\obj\debug\com.dll」です。

@Aのパスにdllとicoを配置すればエラーは解消され、ビルドは通ります。
ビルドが通らないので本来dllも生成されないでしょうし、
この場合、参照設定をdllファイルではなく、comプロジェクトごと
参照先に設定すべきではないかと思っています。

しかし、前までは(とはいえ直近では一年ほど前に動かしたのが最後です。)
この設定のままビルドが通っていましたので、
例えばvisualstudioのバージョンやpcの環境によって参照設定が変更されたりするようなことはあるのでしょうか。

特にアイコンのファイルをわざわざ削除してsvnにあげるようなことはありませんので、
単なるsvnへのコミット漏れとも判断しにくいかと思っています。

このような場合、どう参照設定するのが正しい方法なのでしょうか。
複数プロジェクトを保有するソリューションをあまり触ったことがなく
拙い説明で申し訳ないですが、ご教授いただけますと幸いです。

よろしくお願いします。

引用返信 編集キー/
■96898 / inTopicNo.2)  Re[1]: visualstudio 参照設定の方法が間違っている?
□投稿者/ shu (1244回)-(2021/02/25(Thu) 15:22:14)
No96897 (ゆ さん) に返信


> メインのcom参照先のパスは「c:\usera\app\com\obj\debug\com.dll」です。
>
obj→bin

でないと駄目です。
引用返信 編集キー/
■96899 / inTopicNo.3)  Re[1]: visualstudio 参照設定の方法が間違っている?
□投稿者/ 魔界の仮面弁士 (2976回)-(2021/02/25(Thu) 15:32:59)
No96897 (ゆ さん) に返信
> @「c:\usera\app\com\bin\debug\com.dll」メタデータが見つかりませんでした。
> メインのcom参照先のパスは「c:\usera\app\com\obj\debug\com.dll」です。

obj と bin は別のパスですよね。
ソース管理上には、両方のパスの com.dll をあげているのでしょうか?


> ・com プロジェクト→dll
> ・main プロジェクト→メインアプリケーション
> メインからcom.dllを参照設定しています。

その問題は、既存プロジェクトだけで発生している問題ですか?

特に追加コードの無い、単純な DLL プロジェクトとその参照アプリを作り、
それをソース管理に含めてから、別のワークフォルダーに再取得した場合にも
同様の問題が再現しますか?


> visualstudioで開発したc#アプリケーションを、svnを使ってソース管理しています。

リポジトリの ignore 設定はどのように設定されていますか?

Subversion や Git の場合、Debug や Release や obj などといった
頻繁に自動生成されうるパスに対しては、意図的にリポジトリに
含めないように設定されていることがあります。
(あるいは、ライブラリのパスを外部参照にするケースもあるでしょう)


.ico に関しては、ソース管理に含まれていないと駄目でしょうけれど、
.dll に関しては、com プロジェクトを単体でビルドしなおしてみれば、
main プロジェクトのビルドが通るようになるかもしれません。


> この設定のままビルドが通っていましたので、
> 例えばvisualstudioのバージョンやpcの環境によって参照設定が変更されたりするようなことはあるのでしょうか。

bin\debug\com.dll を参照している main プロジェクトが存在するにも関わらず、
com.dll ファイルが管理対象外になっていた場合、コミットした開発者の環境では
ローカルに DLL が残存したままであるため問題無くビルドできてしまうのに対し、
他の環境でチェックアウトした場合には、参照先のバイナリが無くなっているために、
プロジェクトがビルド時にファイル紛失の警告やエラーを表示するというパターンが起きえますね。
.ico も然り。
引用返信 編集キー/
■96900 / inTopicNo.4)  Re[2]: visualstudio 参照設定の方法が間違っている?
□投稿者/ ゆ (6回)-(2021/02/25(Thu) 15:46:28)
2021/02/25(Thu) 15:47:03 編集(投稿者)

No96898 (shu さん) に返信
> ■No96897 (ゆ さん) に返信
>
>
>>メインのcom参照先のパスは「c:\usera\app\com\obj\debug\com.dll」です。
>>
> obj→bin
>
> でないと駄目です。

shuさん

ご返信ありがとうございます。
ビルドが通るまではobj
必要なdll等を指定のパスに配置して、ビルドが通るとbinに勝手に参照先が切り替わりました。
参照先を切り替えるのはどうようにするのでしょうか?
visualstudioの機能として最適なパスを見に行くようになっているのでしょうか?

また、objでないとダメな理由は、ビルドされるまで
binフォルダにdllが存在しない為、参照できないからという理由でしょうか?

質問ばかり失礼いたします。
教えていただけますと非常にありがたいです。
引用返信 編集キー/
■96901 / inTopicNo.5)  Re[1]: visualstudio 参照設定の方法が間違っている?
□投稿者/ ニケ (13回)-(2021/02/25(Thu) 15:49:46)
No96897 (ゆ さん) に返信
通常はどちらも自作のプロジェクトであれば「プロジェクト参照」をします。
依存関係が明確になっていれば、依存元からビルドされるのでエラーとなりません。

DLLを直接パス指定するのは、プロジェクト管理外のライブラリの参照の場合です。
ビルドは発生しませんし、参照パスに配置されていること前提です。

「プロジェクト参照」できるプロジェクトを直接パス指定する利点は多くないと
思いますが、わざわざ直接パス指定しているのにSVNに上がっていないのであれば
コミット漏れの可能性が高いと思います。直接パスを指定していれば、projファイル
に記録されていると思います。SVNから落としたprojファイルを直接メモ帳で開いて
binの下のパスが記録されていれば、当時からその設定だったということです。
bin,objフォルダは一般的にソース管理に含めないので、敢えてあげなかった可能性も
僅かにあるかもしれません。エラーメッセージ見ればどうせ分かるだろ?的な。

>例えばvisualstudioのバージョンやpcの環境によって参照設定が変更されたりするようなことはあるのでしょうか。
あります。例えばシステムフォルダに登録されたDLLを参照していた場合、登録されて
いない開発環境でビルドしなおすと、DLLを探す段階で出力フォルダに存在するDLLを参照
する場合があります。しかし、存在しないファイルは参照しようが無いので、今回は
該当しないと思います。

>特にアイコンのファイルをわざわざ削除してsvnにあげるようなことはありませんので、
>単なるsvnへのコミット漏れとも判断しにくいかと思っています。
最初はデフォルトアイコンで運用していて、オリジナルのアイコンに変更したのに
アイコンファイルをコミットし忘れた可能性は?管理外のファイルを追加した場合は
わざわざチェックしてコミット対象に含めてやらないとSVNにあがらないでしょ?
引用返信 編集キー/
■96903 / inTopicNo.6)  Re[3]: visualstudio 参照設定の方法が間違
□投稿者/ ニケ (14回)-(2021/02/26(Fri) 16:35:38)
2021/02/26(Fri) 16:46:38 編集(投稿者)
No96900 (ゆ さん) に返信
> 2021/02/25(Thu) 15:47:03 編集(投稿者)
>
> ■No96898 (shu さん) に返信
>>■No96897 (ゆ さん) に返信
>>
>>
> >>メインのcom参照先のパスは「c:\usera\app\com\obj\debug\com.dll」です。
> >>
>>obj→bin
>>
>>でないと駄目です。
>
> shuさん
>
> ご返信ありがとうございます。
> ビルドが通るまではobj
> 必要なdll等を指定のパスに配置して、ビルドが通るとbinに勝手に参照先が切り替わりました。
> 参照先を切り替えるのはどうようにするのでしょうか?
> visualstudioの機能として最適なパスを見に行くようになっているのでしょうか?
>
> また、objでないとダメな理由は、ビルドされるまで
> binフォルダにdllが存在しない為、参照できないからという理由でしょうか?
shuさんの指摘は最もですが、ゆさんの解釈が8割間違っています。
推論を立てるのは良い事ですが、公式ドキュメントなどで調べて補完して下さい。
訂正する内容が多くなると、回答者の作業負担が増えます。

まず「プロジェクト参照」か「DLLファイル直接参照」か明確にして下さい。
通常は「プロジェクト参照」です。

「プロジェクト参照」した時点で依存関係が登録され、ビルドの順番が自動で
決められますので、DLLが存在しないなどという事にはなりません。
※プロジェクトの右クリックメニューから「プロジェクトの依存関係」
「プロジェクトのビルド順序」ダイアログで確認して下さい。
各プロジェクトの出力先から自動で取ってきてくれるので、実際のDLLファイルが
どこに存在するかもビルド時点では気にしなくていいです。

最終的に、作成されたEXE及びDLLファイルを他の端末の同一フォルダに配置して
使いますよね?EXEのプロジェクトのbinの下にまとめてビルドされているはず
ですので、それを使って下さい。

上記以外の内容は蛇足です。把握したいなら各キーワードで調査してきて下さい。
・objフォルダの役割について
キーワード「bin obj 違い」
・DLL参照順について
キーワード「dll 参照 順番」
※DLLの参照順については、OSのルールと、VisualStudio内部の都合によるルール
があります。
引用返信 編集キー/
■96904 / inTopicNo.7)  Re[2]: visualstudio 参照設定の方法が間違っている?
□投稿者/ ゆ (7回)-(2021/02/26(Fri) 17:35:34)
2021/02/26(Fri) 17:38:22 編集(投稿者)

魔界の仮面弁士 さん

ご返信ありがとうございます。

> obj と bin は別のパスですよね。
> ソース管理上には、両方のパスの com.dll をあげているのでしょうか?
お恥ずかしながら、ソース管理といっても適切には管理ができておりません。
開発する上でobjとbinの両方にdllができていれば、そのままコミットしています。
リポジトリにはbinフォルダ内もobjフォルダ内も、どちらにもコミットされていませんでした。


> リポジトリの ignore 設定はどのように設定されていますか?

ignore 設定を確認したところ、dllやiconは含まれていませんでした。
(反対に、含まれていた.logなどをコミットしてみたらコミットできたのですが、これは別問題だと思いますので、別途調べることにします。)


mainからのcom.dllの参照先は先述の通りですが、comプロジェクトのビルド先を確認すると、また別のフォルダになっています。
「c:\outcom\」

本アプリケーションの構成とは外れたフォルダになる為、ローカルにそのdllがあるとしたら、comプロジェクトのビルドができたということだと思います。

> .dll に関しては、com プロジェクトを単体でビルドしなおしてみれば、
> main プロジェクトのビルドが通るようになるかもしれません。
ご指摘のように、ソリューション全体ではなく、comプロジェクトのみを選択してビルドし、再度mainプロジェクトでビルドするとエラーが解消されました。

いったんはビルドの順番を徹底してもらうようにします。
細かな理解できていない点については、実際にいろいろと試してみて理解するようにします。
ありがとうございました。
解決済み
引用返信 編集キー/
■96905 / inTopicNo.8)  Re[2]: visualstudio 参照設定の方法が間違っている?
□投稿者/ ゆ (8回)-(2021/02/26(Fri) 17:55:50)
2021/02/26(Fri) 18:00:02 編集(投稿者)

No96901 (ニケ さん) に返信

comプロジェクトは本来、他のアプリケーションでも流用できるように作られたもので
カスタマイズはしないので、DLLを直接参照すればいいのですが
なぜかソリューションの中にcomプロジェクトが含まれていました。

また、本件とは別ですが、同じ構成で作られた別アプリがあり、
そちらで同様のビルドエラーが発生していたため、DLL直接参照→プロジェクト参照に変更すると
mainプロジェクト内でcomプロジェクトのnamespaceをusingしているところでエラーとなりました。
なぜかは理解できていませんが、comプロジェクトだけをビルドしたのち
ソリューション全体をビルドすると解消しました。
一体何が必要なのか、どう解釈すべきなのか混乱していました。

svnのログを確認したところ、初めてSVNにコミットされた時から
iconファイルがなかった為、iconファイルの上げ忘れというよりは、意図的に削除した(不要だと思った?)可能性はあります。
(アプリケーション関連ファイル一式が一度にコミットされていたがiconだけなし)


そもそも最終コミット後に、他の人がチェックアウトして動かしてるはずなので
ビルドができないなんて、私の環境が悪いのか?という思い込みが悪かったように思います。
大変失礼いたしました。

引用返信 編集キー/
■96906 / inTopicNo.9)  Re[4]: visualstudio 参照設定の方法が間違
□投稿者/ ゆ (9回)-(2021/02/26(Fri) 18:14:35)
No96903 (ニケ さん) に返信

ご教授いただいた内容について理解できました。
ありがとうございます。

一旦は、設定変更や改修をせずに対応できそうなので解決済みとさせていただきます。
理解については学習不足で追いついていませんので、追って確かめていきたいと思います。
解決済み
引用返信 編集キー/
■96907 / inTopicNo.10)  Re[2]: visualstudio 参照設定の方法が間違っている?
□投稿者/ ゆ (10回)-(2021/02/26(Fri) 23:01:52)
魔界の仮面弁士 さん

ご返信ありがとうございます。

> obj と bin は別のパスですよね。
> ソース管理上には、両方のパスの com.dll をあげているのでしょうか?
お恥ずかしながら、ソース管理といっても適切に管理ができておらず、ゴミファイル等も含めてコミットされている場合もあります。
その為、開発する上でobjとbinの両方に仮にdllができていたとすれば、そのままコミットしています。
リポジトリにはbinフォルダ内もobjフォルダ内も、どちらにもコミットされていませんでした。


> リポジトリの ignore 設定はどのように設定されていますか?

ignore 設定を確認したところ、dllやiconは含まれていませんでした。
(反対に、含まれていた.logなどをコミットしてみたらコミットできたのですが、これは別問題だと思いますので、別途調べることにします。)


mainからのcom.dllの参照先は先述の通りですが、comプロジェクトのビルド先を確認すると、また別のフォルダになっています。
「c:\outcom\」

本アプリケーションの構成とは外れたフォルダになる為、ローカルにそのdllがあるとしたら、comプロジェクトのビルドができたということだと思います。

> .dll に関しては、com プロジェクトを単体でビルドしなおしてみれば、
> main プロジェクトのビルドが通るようになるかもしれません。
ご指摘のように、ソリューション全体ではなく、comプロジェクトのみを選択してビルドし、再度mainプロジェクトでビルドするとエラーが解消されました。

細かい疑問点は残りますが、いったんはビルドの順番を徹底してもらうようにします。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ