2012-10-12 7 views
7

私はC#にリソースを埋め込むのに慣れています。私は埋め込みリソースに名前空間を自動的に追加する方法が好きです。それは私がこのようなことを行うことができます:埋め込みVB.NETリソースへのパスに基づいて名前空間を自動的に追加

files\version1\config.xml 
files\version2\config.xml 
files\version2\config.xml 

あなたはVB.NETのプロジェクトで同じことをしようとした場合、それは、ルート名前空間にすべての埋め込みリソースを置くしようとするので、残念ながら、あなたは、コンパイルエラーを取得します。

<EmbeddedResource Include="files\version1\config.xml"> 
    <LogicalName>$(RootNamespace).files.version1.config.xml</LogicalName> 
</EmbeddedResource> 
<EmbeddedResource Include="files\version2\config.xml"> 
    <LogicalName>$(RootNamespace).files.version2.config.xml</LogicalName> 
</EmbeddedResource> 
<EmbeddedResource Include="files\version3\config.xml"> 
    <LogicalName>$(RootNamespace).files.version3.config.xml</LogicalName> 
</EmbeddedResource> 

これは動作しますが、私の質問はこれですので、それは手動で、時間がかかり、エラーを起こしやすいです:これを回避するために、私は手動でそうのような.vbprojファイルを編集することができます をビルドタスクをしたり、イベントを構築するには書き込まれませんこれは自動的に?

答えて

2

これは、Visual Basicが既定で名前空間を作成するためにフォルダパスを使用しない方法の副作用です。

個人的には、具体的なケース以外では、私が名前に追加のフォルダパスをすべて持たないほうが好きです。私は、MSがファイル・リソースに別のプロパティを追加して、将来、ネームスペースを特別に設定できるようにすることを願っています。

解決方法はかなり簡単です。

C#でリソースのみのDLLを作成し、からリソースを読み込みます。 VBの開発者として、私はその特定の目的を満たすためにこれをやっていることについて二度考えていません。

EDIT。 OR ...シミュレートされた名前空間を作成するために必要な形式でファイルを新しいリソースディレクトリにコピーするために、prebuildイベントとしてvbsファイルを使用できます。

dim fSys 
set fsys=createobject("Scripting.FileSystemObject") 
dim root : root= "c:\temp" 
dim out : out="c:\temp\DynResource" 

dim rFo: set rFo=fsys.getfolder(root) 
dim outPath 

for each sf in rFo.SubFolders 
    if instr(1, sf.name, "Version")>=1 then 'valid resource folder 
     for each f in sf.Files 
      outpath = out & "\" & sf.name & "." & f.name 
      if fsys.FileExists(output) then 
       dim tf:set tf=fsys.getfile(output) 
       if tf.length<>f.length or tf.DateLastModified<>f.DateLastModified then 
        f.copy outPath,true 
       else 
        'same file, no update required. 
       end if 
      else 
       f.copy outPath,true 
      end if 
     next 
    end if 
next 

出力foldereは既に存在していなければなりません(フォルダ名には「バージョン」が含まれている必要があります)。

+0

私はあなたがそれをどのように見ているかによって決まると思います。これを達成するために他のプロジェクト全体を追加するのは簡単ですが、単純ではありません。実際に言えば、私は別のdllを配布しなければならないか、それらを組み合わせてpostビルドする必要があります。私はこれを代替案として投票しますが、同じプロジェクト内でこれを達成できるビルド・タスクやビルド・イベントを探しているので、答えとして受け入れることはできません。 –

+0

True enouhg、あまりにも多くのDLLを追加するのは好きではありません。あなたが持っているものに似た形式ですべてのファイルを保管することはどうでしょうか? 「Version ...」フォルダをループして1つの出力ディレクトリに追加することができる短いVBSスクリプトを作成してください。ファイルが最初に変更されたことを確認するためのチェックを追加するだけで、毎回各ファイルを書き換えません。これらのファイルをすべて埋め込みリソースとしてマークすると、そのファイルを上書きしてもリセットされません。繰り返しますが、これを行うための適切な方法ではなく、手作りの部分を少なくとも取り除くことができます。 – DarrenMB

関連する問題