代码之家  ›  专栏  ›  技术社区  ›  Jim Burger

如何管理F项目中的资源?

  •  20
  • Jim Burger  · 技术社区  · 14 年前

    我可以在F_2.0项目中使用.resx文件吗?

    如果是这样,我该如何添加,然后使用这些资源。

    事先谢谢。

    4 回复  |  直到 8 年前
        1
  •  17
  •   Brian    14 年前

    你可以 Add existing item .resx 文件到一个F项目,它应该自动得到一个 BuildAction 属于 EmbeddedResource 还有工作。这里的vs工具还不如其他语言好,但是msbuild完成了所有繁重的工作,所以只需将正确的XML片段放入.fsproj文件中即可。

        2
  •  10
  •   Onorio Catenacci    8 年前

    我在F 2.0项目中使用.resx。请随便看看,我希望它能帮到你。没有太大的震动,但这是为了它的价值。

    http://github.com/OnorioCatenacci/ExtendedSearch

    编辑:对于它的价值,这里是fsproj文件的相关部分

      <ItemGroup>
        <Compile Include="assemblyinfo.ExtendedSearch.exe.fs" />
        <Compile Include="ExtendedSearch.fs" />
        <EmbeddedResource Include="ExtendedSearch.resx" />
      </ItemGroup>
    

    这里是extendedsearch.resx:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, ...</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, ...</value>
      </resheader>
      <!-- 
        Microsoft ResX Schema 
    
        Version 2.0
    
        The primary goals of this format is to allow a simple XML format 
        that is mostly human readable. The generation and parsing of the 
        various data types are done through the TypeConverter classes 
        associated with the data types.
    
        Example:
    
        ... ado.net/XML headers & schema ...
        <resheader name="resmimetype">text/microsoft-resx</resheader>
        <resheader name="version">2.0</resheader>
        <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
        <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
        <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
        <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
        <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
            <value>[base64 mime encoded serialized .NET Framework object]</value>
        </data>
        <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
            <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
            <comment>This is a comment</comment>
        </data>
    
        There are any number of "resheader" rows that contain simple 
        name/value pairs.
    
        Each data row contains a name, and value. The row also contains a 
        type or mimetype. Type corresponds to a .NET class that support 
        text/value conversion through the TypeConverter architecture. 
        Classes that don't support this are serialized and stored with the 
        mimetype set.
    
        The mimetype is used for serialized objects, and tells the 
        ResXResourceReader how to depersist the object. This is currently not 
        extensible. For a given mimetype the value must be set accordingly:
    
        Note - application/x-microsoft.net.object.binary.base64 is the format 
        that the ResXResourceWriter will generate, however the reader can 
        read any of the formats listed below.
    
        mimetype: application/x-microsoft.net.object.binary.base64
        value   : The object must be serialized with 
                : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.soap.base64
        value   : The object must be serialized with 
                : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.bytearray.base64
        value   : The object must be serialized into a byte array 
                : using a System.ComponentModel.TypeConverter
                : and then encoded with base64 encoding.
        -->
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <data name = "AppDisplayName">
        <value>Extended Search</value>
      </data>
      <data name="FilePathSpecLabel">
        <value>Base File Path:</value>
      </data>
      <data name="FilePathSpecDefault">
        <value>C:\</value>
      </data>
      <data name ="SelectDirButtonLabel">
        <value>. . .</value>  
      </data>  
      <data name="FileNameSpecLabel">
        <value>File Name Spec:</value>
      </data>
      <data name="FileNameSpecDefault">
        <value>*.dll</value>
      </data>
      <data name="RecurseIntoSubdirsLabel">
        <value>Recurse Into Subdirectories</value>
      </data>
      <data name ="MajorVerDefault">
        <value>1</value>
      </data>
      <data name="MinorVerDefault">
        <value>0</value>
      </data>
      <data name="RevisionVerDefault">
        <value>0</value>
      </data>
      <data name="BuildVerDefault">
        <value>0</value>
      </data>
      <data name="VersionLabel">
        <value>File &amp;Version:</value>
      </data>
      <data name="SearchButtonCaption">
        <value>&amp;Search</value>
      </data>
      <data name="CancelButtonCaption">
        <value>&amp;Cancel</value>
      </data>
    </root>
    

    我希望这能消除人们在Github上找不到这个的任何问题。

        3
  •  6
  •   j0k gauthamp    12 年前

    这是另一种方法。虽然我知道这对最初的问题来说太晚了,但我希望它能帮助其他人。

    1. 创建一个名=值格式的干净文本文件,每行一个键/值对。在名为“strings.txt”的文件中,写入

      name1=hello
      name2=world
      
    2. 使用步骤1中的resgen.exe对文本文件执行操作来创建资源文件。您可以在了解resgen http://msdn.microsoft.com/en-us/library/ccec7sz1%28v=vs.80%29.aspx . resgen将创建一个名为“strings.resources”的clr二进制文件。把这个资源文件放在编译器可以找到的地方。

    3. 添加“-resource:strings.resources”作为编译器选项。我是从构建属性中的“其他标志”文本框中完成的。有关更多信息,请访问 http://msdn.microsoft.com/en-us/library/dd233171.aspx

    4. 在你的项目中写下以下内容

      open System.Resources
      let res = ResourceManager("strings", System.Reflection.Assembly.GetExecutingAssembly())
      res.GetString("name1") + res.GetString("name2") |> printfn "%s"
      
        4
  •  4
  •   George    9 年前

    要将资源添加到现有的F项目,请按@“Onorio Catenaci” GitHub Linke 上面…

    1. 创建一个文本文件并用下面的内容填充它,然后保存并关闭它。
    2. 将此文本文件扩展名重命名为 .resx (XML资源文件)
    3. 更新 Build Action EmbeddedResource
    4. 该文件现在应该在vs资源编辑器中正确打开,允许您编辑其内容。

    RESX 文件模板:

        <root>
          <resheader name="resmimetype"><value>text/microsoft-resx</value></resheader>
          <resheader name="version"><value>2.0</value></resheader>
          <resheader name="reader"><value>System.Resources.ResXResourceReader, System.Windows.Forms, ...</value></resheader>
          <resheader name="writer"><value>System.Resources.ResXResourceWriter, System.Windows.Forms, ...</value></resheader>
          <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
            <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
            <xsd:element name="root" msdata:IsDataSet="true">
              <xsd:complexType>
                <xsd:choice maxOccurs="unbounded">
                  <xsd:element name="metadata">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element name="value" type="xsd:string" minOccurs="0" />
                      </xsd:sequence>
                      <xsd:attribute name="name" use="required" type="xsd:string" />
                      <xsd:attribute name="type" type="xsd:string" />
                      <xsd:attribute name="mimetype" type="xsd:string" />
                      <xsd:attribute ref="xml:space" />
                    </xsd:complexType>
                  </xsd:element>
                  <xsd:element name="assembly">
                    <xsd:complexType>
                      <xsd:attribute name="alias" type="xsd:string" />
                      <xsd:attribute name="name" type="xsd:string" />
                    </xsd:complexType>
                  </xsd:element>
                  <xsd:element name="data">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                        <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                      </xsd:sequence>
                      <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                      <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                      <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                      <xsd:attribute ref="xml:space" />
                    </xsd:complexType>
                  </xsd:element>
                  <xsd:element name="resheader">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                      </xsd:sequence>
                      <xsd:attribute name="name" type="xsd:string" use="required" />
                    </xsd:complexType>
                  </xsd:element>
                </xsd:choice>
              </xsd:complexType>
            </xsd:element>
          </xsd:schema>
        </root>