Visual studio 2010のリソース管理でどハマりした話
最近お業務でおC#をぼちぼち触るフェーズに帰ってきました。
で、外部データファイルを埋め込みリソースでプログラム内で読み出して利用っていうパターンをやろうとしてて、
そこでどハマりした。
Visula Studio2010のリソースファイル管理は正直わかりづらい
わかりづらいし不親切だと思ってます。
そもそも、埋め込みリソースとは
すごーく簡単に言うと、
- リンクリソース:VisualStudioのプロジェクト内にファイルパスだけ埋め込むこと
- 埋め込みリソース:実行ファイル(.exe)内にバイナリでファイルそのものを埋め込むこと
を指します。
リンクリソースはただ単にプロジェクト内でファイルを管理しやすくするだけのもので、実行時にそのファイルがPC内に存在している必要があります。
埋め込みリソースは実行時にファイルがなくてもそのファイルを使うことができます。何しろ埋め込まれているので。
(当然、ビルド時点でのファイルが埋め込まれるため、そのファイルを更新したい場合は再度ビルドを行う必要があります)
このリソースファイルは、基本的にプロジェクト直下のPropertiesフォルダ内のresources.resxというファイルの中で管理されることになります。
このファイルにアクセスする時は[プロジェクト名].Propeties.Resources.[ファイル名]
という形で行います。
ここでハマった
名前空間の罠がここにありました。
こんな感じの罠。
MyProject(プロジェクト名)
|-Resources.resx
|-MyProject.cs
|-...
で、MyProject.cs内ではこんな名前空間で運用されていました。
//MyProject.cs namespace SomeNameSpace { public class MyProject { ... } }
この時、リソースファイルmyResourceFileにアクセスしようとした場合、
//AnyClass namespace SomeNameSpace { class AnyClass { var file = MyProject.Properties.Resources.myResourceFile; } }
となるのですが、VisualStudioはMyProject
を同一名前空間内のMyProjectクラス
として認識するので、Propertiesを見つけられずエラーとなります。
解決策
正直なところ、どんだけ調べてもこれでハマってる人を見つけられなかったのでパワータイプなソリューションを取りました。
- MyProjectクラスのクラス名をMyProject_とかに変更
バッチリアンチパターンな気がしますけど名前空間変えるのもちょっと・・・という感じだったので仕方なかったかなと思います。
Resources.resx内のPropertiesクラスの名前空間変えるのもアリだったかもしれないんですが、
VisualStudioが直接管理しているファイル(ビルド時に埋め込むとか)なので影響がよくわからなかったのでやめました。
まあちょっと特異な例だったのでしょうがないかなと思わなくはないですけど・・・。
2015とかだと改善されてることを期待します。