7

我习惯于在 C# 中嵌入资源,我喜欢它自动将命名空间添加到嵌入资源的方式。这让我可以做这样的事情:

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

不幸的是,如果您在 VB.NET 项目中尝试相同的操作,则会出现编译错误,因为它会尝试将所有嵌入式资源放入根命名空间。为了解决这个问题,我可以.vbproj像这样手动编辑文件:

<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>

虽然这是可行的,但它是手动的、耗时且容易出错的,所以我的问题是:可以自动编写构建任务或构建事件吗?

4

1 回答 1

2

这是默认情况下 Visual Basic 不使用文件夹路径来创建命名空间的副作用。

就个人而言,除特定情况外,您所谈论的我更喜欢名称中没有所有其他文件夹路径。我希望 MS 在文件资源中添加另一个属性,以允许将来专门设置命名空间,但在那之前......

解决方案很简单。

在 C# 中创建一个仅资源的 dll 并从那里读取您的资源。作为一名 VB 开发人员,我不会三思而后行地满足特定目的。

编辑。或者...可以使用 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 

输出文件夹必须已经存在(并且文件夹名称中显然不能有“版本”)。

于 2013-04-14T22:44:27.817 回答