埋め込まれたリソースの読込について

タグの編集
投稿者 SSD  (社会人) 投稿日時 2022/6/21 09:42:59
埋め込まれたリソースの読込について教えてください。
環境はVisual Studio 2019 Community, .Net Framework 4.7.2です。

プロジェクト内に配置したXMLファイルを読み込もうとしています。
対象のファイルのビルドアクションを「埋め込みリソース」にして、
assembly.GetManifestResourceStreamによって読み込むコードを作りしました。

ソリューションの構成、対象のファイルは以下のようにしています。
https://drive.google.com/file/d/11PCk-PxeD5K0oBHfpU6HsiZaQYFuTqLt/view?usp=sharing
https://drive.google.com/file/d/1TEaRJ7v3CADpFj5EgGiQVbkzBf3bX-Yq/view?usp=sharing

※いくつか試したのですが、[IMAGE]タグ?で表示できなかったので画像のURLを直貼りしました。
お手数ですが、URLをコピーの上ブラウザの別画面でご覧ください


コードは以下のような感じです。
    Public Sub SetItems()
        Dim assembly As Assembly = Assembly.GetExecutingAssembly
        '↓この時点でstreamがNothing = 読み込まれていない 
        Dim stream As Stream = assembly.GetManifestResourceStream("SHConvert.XML.CSVLayout.xml")
        Dim xmlDocument As New XmlDocument()
        '↓これはエラー(NullArgument) 
        xmlDocument.Load(stream)
        '↓こっちだとうまくいく 
        xmlDocument.Load("[社内共有フォルダのパス]\CSVLayout.xml")
    End Sub


このコードでデバッグを開始すると、
xmlDocument.Load(stream)の部分でエラーになります。
社内サーバーの共有フォルダに保存した同じファイルのコピーを読み込む
xmlDocument.Load("[社内共有フォルダのパス]\CSVLayout.xml")
の方であればうまく読み込めます。

リソースの指定文字列は間違っていないと思うのですが、なぜか読み込んでくれません。
もし原因が分かる方いらっしゃいましたら教えて頂けないでしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/6/21 10:55:42
> '↓この時点でstreamがNothing = 読み込まれていない 
ということは、指定したリソース名が間違っているということです。

Dim names = Assembly.GetExecutingAssembly().GetManifestResourceNames()
を使うと、リソース名の一覧を取得できるので確認してみてください。


ちなみに VB のリソース埋め込みでは、
プロジェクト内のフォルダー階層が考慮されません。

そのため VB では、
 \XML1\CSVLyout.xml
 \XML2\CSVLyout.xml
のようなリソース埋め込みが許可されないことに注意してください。
※ C# は OK。


> Dim assembly As Assembly
> Dim xmlDocument As New XmlDocument()
変数名と型名を同じ名前にすることは避けましょう。

VB は C# と違って「大文字小文字を区別しない言語」です。
そのため、このような名前付けをしてしまうと、
静的メンバーの呼出しとインスタンスメンバーの呼出しを
区別しにくくなってしまいます。


> = Assembly.GetExecutingAssembly
引数が不要な場合でも、「メソッドの呼び出し」には常に丸かっこを付与することをおすすめします。
= Assembly.GetExecutingAssembly()

※VB の場合、引数の無いメソッドを呼ぶ際の丸かっこは省略できるのですが、
 COM コンポーネント対するレイトバインドの場合、括弧の有無で動作が異なることがあります。
投稿者 SSD  (社会人) 投稿日時 2022/6/21 13:55:03
魔界の仮面弁士 様

ありがとうございます。

確認したところ
SHConvert.XML.CSVLayout
ではなく
SHConvert.CSVLayout
となっていました。

いくつかのサイトで調べた時はプロジェクト内の階層を
リソース名の指定時に入れるように書かれていたのですが、
自分が見た情報が古かったのかもしれません。

その他コーディングについてのアドバイスもありがとうございます。
そのようにしてみようと思います。