<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
 
  https://www.apache.org/licenses/LICENSE-2.0
  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<html>
  <head>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Ilasm Task</title>
  </head>

<body>

    <h2>Ilasm Task</h2>

    <h3><a name="description"></a></h3>

    <p>Assembles .NET Intermediate Language files. ilasm.exe must be
    on the execute path, unless another executable or the full path to
    that executable is specified in the <tt>executable</tt>
    parameter.</p>

    <p>All parameters are optional: <code>&lt;il/&gt;</code> should
    suffice to produce a debug build of all *.il files. The option set
    is roughly compatible with the CSharp class; even though the
    command line options are only vaguely equivalent. [The low level
    commands take things like /OUT=file, csc wants /out:file
    ... /verbose is used some places; /quiet here in ildasm... etc.] 
    It would be nice if someone made all the command line tools
    consistent (and not as brittle as the java cmdline tools).</p>

    <p>The task is a directory based task, so attributes like
    <b>includes="*.il" </b> and <b>excludes="broken.il"</b> can be
    used to control the files pulled in. You can also use nested
    &lt;src&gt filesets to refer to source.</p>

    <h3><a name="attributes">Parameters</a></h3>

    <table>
      <tr>
        <td valign="top" align="left">
          <b>Attribute</b>
        </td>
        <td valign="top" align="left">
          <b>Description</b>
        </td>
        <td valign="top" align="left">
          <b>Type</b>
        </td>
        <td valign="top" align="left">
          <b>Requirement</b>
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          debug
        </td>
        <td valign="top" align="left">
          set the debug flag on or off.
        </td>
        <td valign="top" align="left">
          boolean
        </td>
        <td valign="top" align="left" rowspan="10">
          Optional
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          destfile
        </td>
        <td valign="top" align="left">
          Set the name of exe/library to create.
        </td>
        <td valign="top" align="left">
          File
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          extraoptions
        </td>
        <td valign="top" align="left">
          Any extra options which are not explicitly supported by this task.
        </td>
        <td valign="top" align="left">
          String
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          failonerror
        </td>
        <td valign="top" align="left">
          If true, fails if ilasm tool fails.
        </td>
        <td valign="top" align="left">
          boolean
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          keyfile
        </td>
        <td valign="top" align="left">
          the name of a file containing a private key.
        </td>
        <td valign="top" align="left">
          File
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          listing
        </td>
        <td valign="top" align="left">
          If true, produce a listing (off by default).
        </td>
        <td valign="top" align="left">
          boolean
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          outputfile
        </td>
        <td valign="top" align="left">
          Set the output file; identical to setDestFile
        </td>
        <td valign="top" align="left">
          File
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          resourcefile
        </td>
        <td valign="top" align="left">
          name of resource file to include.
        </td>
        <td valign="top" align="left">
          File
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          srcdir
        </td>
        <td valign="top" align="left">
          Set the source directory of the files to be compiled.
        </td>
        <td valign="top" align="left">
          File
        </td>
      </tr>

      <tr>
        <td valign="top" align="left">
          verbose
        </td>
        <td valign="top" align="left">
          If true, enable verbose ILASM output.
        </td>
        <td valign="top" align="left">
          boolean
        </td>
      </tr>

    </table>

    <h3><a name="elements">Parameters as nested elements</a></h3>

    <h4>reference (org.apache.tools.ant.types.FileSet)</h4>

    <p>add a new reference fileset to the compilation</p>

    <h4>src (org.apache.tools.ant.types.FileSet)</h4>

    <p>add a new source directory to the compile</p>

    <p class="copyright">
      Apache Ant, Apache .NET Ant Library, Ant, .NET Ant Library, Apache, the Apache feather logo, and the Apache Ant project logos are trademarks of The Apache Software Foundation.
    </p>
</body>
</html>
