<!--
  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
 
  http://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>Dotnet Ant Library</title>
  </head>

  <body>
    <h2>Introduction</h2>

    <p>This is a library of Ant tasks that support using .NET
    executables accross different platforms and in particular support
    using common .NET development tools like <a
    href="http://nant.sourceforge.net/">NAnt</a> or <a
    href="http://www.nunit.org/">NUnit</a> from within Ant.</p>

    <p>The original .NET support from Ant's core has also been moved
      to this library.</p>

    <h2>Requirements</h2>

    <p>The current version requires Ant 1.7.0 or later.</p>

    <h2>Where is it?</h2>

    <p>The source code for the library lives in Ant's SVN - <a
    href="http://svn.apache.org/repos/asf/ant/antlibs/dotnet/trunk/">http://svn.apache.org/repos/asf/ant/antlibs/dotnet/trunk/</a>,
    binary and source distributions are available available from the
    Ant website: <a
    href="http://ant.apache.org/antlibs/srcdownload.cgi">source</a>
    and <a
    href="http://ant.apache.org/antlibs/bindownload.cgi">binary</a>.</p>

    <h2>Feedback</h2>

    <p>Please use <a href="http://issues.apache.org/bugzilla/">Ant's
    issue tracker</a> for bug reports, choose "Ant" as the product and
    ".NET Antlib" as the category.  The <a
    href="http://ant.apache.org/bugs.html">hints</a> about reporting
    bugs certainly apply to this Ant library as well.</p>

    <p>For questions about this Ant library use the user or dev <a
    href="http://ant.apache.org/mail.html">mailing list</a> of the Ant
    project.  You must be subscribed to the list in order to post a
    question.</p>

    <h2>Installation</h2>

    <p>If you are building this from sources, run the antlib target
    and you'll get a file <code>ant-dotnet.jar</code>.  If you've
    downloaded a binary release, you are already there.</p>

    <p>There are several ways to use the tasks:</p>

    <ul>
      <li>The traditional way:
        <pre>
          &lt;taskdef 
            resource="org/apache/ant/dotnet/antlib.xml"&gt;
            &lt;classpath&gt;
              &lt;pathelement location="YOUR-PATH-TO/ant-dotnet.jar"/&gt;
            &lt;/classpath&gt;
          &lt;/taskdef&gt;
        </pre>

        With this you can use the tasks like plain Ant tasks, they'll
        live in the default namespace.  I.e. if you can run
        &lt;exec&gt; without any namespace prefix, you can do so for
        &lt;dotnetexec&gt; as well.
      </li>

      <li>Similar, but assigning a namespace URI
        <pre>
          &lt;taskdef 
            uri="antlib:org.apache.ant.dotnet"
            resource="org/apache/ant/dotnet/antlib.xml"&gt;
            &lt;classpath&gt;
              &lt;pathelement location="YOUR-PATH-TO/ant-dotnet.jar"/&gt;
            &lt;/classpath&gt;
          &lt;/taskdef&gt;
        </pre>

        This puts you task into a separate namespace than Ant's
        namespace.  You would use the tasks like

        <pre>
          &lt;project
            xmlns:dn="antlib:org.apache.ant.dotnet"
            xmlns="antlib:org.apache.tools.ant"&gt;
            ...
            &lt;dn:nant&gt;
              &lt;dn:target name="my-target"/&gt;
            &lt;/dn:nant&gt;
        </pre>

        or

        <pre>
          &lt;nant xmlns="antlib:org.apache.ant.dotnet"&gt;
            &lt;target name="my-target"/&gt;
          &lt;/nant&gt;
        </pre>

        or a variation thereof.
      </li>

      <li>Using Ant's autodiscovery.  Place <code>ant-dotnet.jar</code>
      into a directory and use <code>ant -lib
      DIR-CONTAINING-THE-JAR</code> or copy it into
      <code>ANT_HOME/lib</code> - and then in your build file, simply
      declare the namespace on the <code>project</code> tag:

        <pre>
          &lt;project
            xmlns:dn="antlib:org.apache.ant.dotnet"
            xmlns="antlib:org.apache.tools.ant"&gt;
        </pre>

        And all tasks of this library will automatically be available
        in the <code>dn</code> namespace without any
        <code>taskdef</code>.
      </li>
    </ul>

    <h2>Tasks</h2>

    <ul>
      <li><a href="old-core.html">The old code .NET tasks</a>
      including C#, VB.NET and J# compiler tasks.</li>

      <li><a href="dotnetexec.html">dotnetexec</a> - run a .NET
      assembly that's in your PATH.  You can chose the framework that
      is going to be used - defaults to Mono on non-Windows platforms
      and Microsoft's on Windows.</li>

      <li><a href="fsc.html">fsc</a> - F# compiler task.</li>

      <li><a href="nant.html">nant</a> - execute the NAnt build
      tool.</li>

      <li><a href="msbuild.html">msbuild</a> - execute the MSBuild build
      tool of Microsoft's .NET framework 2.0.</li>

      <li><a href="wix.html">wix</a> - execute candle and/or light of
      the WiX toolset.</li>

      <li><a href="tallow.html">tallow</a> - execute tallow of the WiX
      toolset.</li>

      <li><a href="nunit.html">nunit</a> - execute the
      nunit-console.exe <a href="http://www.nunit.org/">NUnit</a>
      test runner.</li>
    </ul>
  </body>
</html>
