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

时间:2010-04-22 09:03:38

标签: f# resources projects

我可以在F#2.0项目中使用.resx文件吗?

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

提前致谢。

4 个答案:

答案 0 :(得分:17)

您可以Add existing item.resx个文件发送到F#项目,它应该自动获得BuildAction EmbeddedResource并且可以正常工作。这里的VS工具还没有其他语言那么好,但是MSBuild完成了所有繁重的工作,所以只需要将正确的XML片段放到.fsproj文件中。

答案 1 :(得分:10)

我在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上找到此问题的任何未来问题。

答案 2 :(得分:6)

这是另一种方式。虽然我知道原来的问题已经太迟了,但我希望它可以帮助别人。

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

    name1=hello
    name2=world
    
  2. 使用ResGen.exe创建资源文件,该文件作用于步骤1中的文本文件。您可以在http://msdn.microsoft.com/en-us/library/ccec7sz1%28v=vs.80%29.aspx了解ResGen。 ResGen将创建一个名为“strings.resources”的CLR二进制文件。将此资源文件放在编译器可以找到的位置。

  3. 添加“--resource:strings.resources”作为编译器选项。我是通过Build属性中的“Other flags”文本框完成的。您可以在http://msdn.microsoft.com/en-us/library/dd233171.aspx

  4. 找到更多信息
  5. 在F#项目中写下以下内容

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

答案 3 :(得分:4)

要将资源添加到现有的F#项目,请按@&#34; Onorio Catenacci&#34;上面GitHub Linke ......

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