Hi guys,
I have a C# script within my NAnt build file which allows me to accept
user input from the commandline. A truncutated excerpt of the NAnt
build file is:
...
<property name="username" value="" />
<property name="password" value="" />
<property name="database" value="" />
...
<target name="menu">
<script language="C#" mainclass="GetInput">
<code>
<![CDATA[
class GetInput
{
public static void ScriptMain(Project project)
{
Console.Clear();
Console.WriteLine("===================================================================");
Console.WriteLine("Welcome to the Compile and Deploy
Oracle Forms and Reports Facility");
Console.WriteLine("===================================================================");
Console.Write("Please enter username: ");
project.Properties["username"] = Console.ReadLine();
Console.WriteLine();
Console.Write("Please enter password: ");
project.Properties["password"] = Console.ReadLine();
Console.WriteLine();
Console.Write("Please enter database: ");
project.Properties["database"] = Console.ReadLine();
Console.WriteLine();
...
]]>
</code>
</script>
</target>
When I run this build file from the commandline, it works perfectly.
However, when I call this build file from CCNet it does not work. The
only reason for this I can think of is that when CCNet calls the NAnt
script, it is not sure how to pass the C# script calls to the
System.Console class to the commandline. I'm not sure how to do this
though.
I've also been playing around with the idea of the C# script opening a
new instance of cmd.exe and then trying to execute the remainder of
the script. From searches on Google, I found the following solution
that works as a C# class:
using System;
using System.Windows.Forms;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
class Program
{
[DllImport("kernel32.dll",
EntryPoint = "GetStdHandle",
SetLastError = true,
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll",
EntryPoint = "AllocConsole",
SetLastError = true,
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int AllocConsole();
private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static string deployment = "\\\\vm-osb-oasd\\sohaan";
static void Main(string[] args)
{
AllocConsole();
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle,
true);
FileStream fileStream = new FileStream(safeFileHandle,
FileAccess.Write);
Encoding encoding =
System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
StreamWriter standardOutput = new StreamWriter(fileStream,
encoding);
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
Console.Clear();
Console.WriteLine("===================================================================");
Console.WriteLine("Welcome to the Compile and Deploy Oracle
Forms and Reports Facility");
Console.WriteLine("===================================================================");
Console.Write("Please enter username: ");
string username = Console.ReadLine();
....
}
}
This works perfectly in a C# environment. However, I do not know how
to embed it within a NAnt script correctly...From what I know about
NAnt, I may need to create an extension, but am uncertain of how to go
about this. Can anyone help me out?
--
Subscription settings: http://groups.google.com/group/ccnet-user/subscribe?hl=en