【问题标题】:Visual Studio Item Templates and Resource FilesVisual Studio 项目模板和资源文件
【发布时间】:2013-01-07 07:13:54
【问题描述】:

我正在尝试为创建多个文件的 Visual Studio 创建自定义项模板。其中两个文件是Resource.resx 文件和一个相应的“Resource.Designer.cs”文件。

我已经设法将它们显示为父子文件,并在 .vstemplate 文件中声明:

<ProjectItem ItemType="EmbeddedResource" TargetFileName="$fileinputname$Resources.resx" ReplaceParameters="true">Resources.resx</ProjectItem>
<ProjectItem TargetFileName="$fileinputname$Resources.resx\$fileinputname$Resources.Designer.cs" ReplaceParameters="true">Resources.Designer.cs</ProjectItem>

这也将Resource.resx 声明为嵌入式资源。

我现在遇到的问题是Resource.resx 文件在使用此模板创建项目后没有使用Resources.Designer.cs 作为代码隐藏文件。只要我在Resource.resx 文件中添加一个新的资源字符串,它就会创建一个新的Resources1.Designer.cs 文件,Visual Studio 从那时起将其用作代码。

我检查了在 Visual Studio 创建新的代码隐藏文件之前和之后在 .csproj 文件中所做的更改,我发现主要原因是因为 Resource.resx 文件没有 &lt;LastGenOutput&gt; 条目。

有没有办法通过.vstemplate 声明&lt;LastGenOutput&gt; 或任何其他方式将.resx 文件与它的代码隐藏文件连接起来而无需手动执行?

【问题讨论】:

    标签: visual-studio-2010 visual-studio-templates


    【解决方案1】:

    尚不清楚为什么需要此模板,因为它已包含在 Visual Studio 中。您可以使用 Project + Add New Item + General + Resources File 选择它。

    如果您想自定义它,那么最好的办法是从现有的开始。导航到 C:\Program Files (x86)\Microsoft Visual Studio x.x\Common7\IDE\ItemTemplatesCache\CSharp\General\1033\Resource.zip 其中 x.x 是 VS 版本号,如果您不使用 1033 可能会有所不同VS英文版。

    我将发布您在那里找到的 .vstemplate 文件,请务必复制/粘贴该文件以自行开始:

    <?xml version="1.0" encoding="utf-8"?>
    <VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
      <TemplateData>
        <Name Package="{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}" ID="2390" />
        <Description Package="{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}" ID="2391" />
        <Icon Package="{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}" ID="4565" />
        <TemplateID>Microsoft.CSharp.Resource</TemplateID>
        <ProjectType>CSharp</ProjectType>
        <RequiredFrameworkVersion>2.0</RequiredFrameworkVersion>
        <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
        <DefaultName>Resource.resx</DefaultName>
      </TemplateData>
      <TemplateContent>
        <ProjectItem>Resource.resx</ProjectItem>
        <CustomParameters>
          <CustomParameter Name="$itemproperties$" Value="CustomTool" />
          <CustomParameter Name="$CustomTool$" Value="ResXFileCodeGenerator" />
        </CustomParameters>
      </TemplateContent>
      <WizardExtension>
        <Assembly>Microsoft.VisualStudio.Editors, Version=9.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
        <FullClassName>Microsoft.VisualStudio.Editors.ResourceEditor.ResxItemWizard</FullClassName>
      </WizardExtension>
    </VSTemplate>
    

    如果您想添加更多文件,请添加更多 &lt;ProjectItem&gt; 元素。

    【讨论】:

    • 这正是我想要的。解决方案的关键部分是&lt;WizardExtension&gt;&lt;CustomParameters&gt;
    • 在旁注中,您知道如何使生成的.resx 文件public 而不是默认设置的internal 吗?
    • @Hans is this just useful or brilliant? 的使命是 feature request :)
    【解决方案2】:

    父子关系应在 C# 项目文件 (.csproj) 中使用 DependendUpon 标签声明,如下所示:

    <Project ...>
       ...
        <ItemGroup>
          ...
            <EmbeddedResource Include="Resources.resx">
               ...
            </EmbeddedResource>
            <Compile Include="Resources.Designer.cs">
                <DependentUpon>Resources.resx</DependentUpon>
                ...
            </Compile>
            ...
        </ItemGroup>
     </Project>
    

    【讨论】:

    • 我已经管理了与Visual Studio 层次结构相关的父子关系。但它不处理类和设计器之间的映射。它必须通过.csproj 文件中的&lt;LastGenOutput&gt; 标记来处理。而且,虽然我知道.csproj 文件应该是什么样子,但我很难通过Visual Studio Item Template.. 指定它。
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多