0

この問題の根本的な原因は何ですか?CSharpOptParse、XslTransform.Transform(...)、またはNUnit?この問題が修正できない場合、積極的にサポートされている他の同等のライブラリを代わりに使用できますか?

2005年2月に最後に変更されたCSharpOptParseのバージョン1.0.1を使用しています。

CSharpOptParseと一緒に使用する次のクラス(もちろんこの例では簡略化されています)があります。

public enum CommandType
{
   Usage
}

public class Options
{
   [OptDef(OptValType.Flag)]
   [LongOptionName("help")]
   [Description("Displays this help")]
   public bool Help { get; set; }

   public CommandType CommandType
   {
      get { return CommandType.Usage; }
   }
}

問題を再現する単体テストコードを次に示します。

TextWriter output = Console.Out;

Options options = new Options { Help = true };
Parser p = ParserFactory.BuildParser(options);
p.Parse();

output.WriteLine("Usage: Console [--a]");
UsageBuilder builder = new UsageBuilder();
builder.BeginSection("Arguments:"); 
builder.AddOptions(p.GetOptionDefinitions()); //could the issue be created here?
builder.EndSection();
builder.ToText(output, OptStyle.Unix, true); //The problem occurs here

正しいセクションでUsageBuilderを設定しないことで、問題が発生している可能性はありますか?おそらくこれはxsltファイルで問題を引き起こしている可能性があります???

そのコードを実行すると、次の例外が発生します。

    System.Xml.XPath.XPathException : Function 'ext:FormatText()' has failed.
    ----> System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
      ----> System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: startIndex
       at MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator nodeIterator)
       at System.Xml.Xsl.XsltOld.Processor.ValueOf(ActionFrame context, Int32 key)
       at System.Xml.Xsl.XsltOld.ValueOfAction.Execute(Processor processor, ActionFrame frame)
       at System.Xml.Xsl.XsltOld.ActionFrame.Execute(Processor processor)
       at System.Xml.Xsl.XsltOld.Processor.Execute()
       at System.Xml.Xsl.XsltOld.Processor.Execute(TextWriter writer)
       at System.Xml.Xsl.XslTransform.Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)
       at System.Xml.Xsl.XslTransform.Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)
       at CommandLine.OptParse.UsageBuilder.ToText(TextWriter writer, OptStyle optStyle, Boolean includeDefaultValues, Int32 maxColumns)
--TargetInvocationException
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
    at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
    at System.Xml.Xsl.XsltOld.XsltCompileContext.FuncExtension.Invoke(XsltContext xsltContext, Object[] args, XPathNavigator docContext)
    at MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator nodeIterator)
    --ArgumentOutOfRangeException
    at System.String.LastIndexOfAny(Char[] anyOf, Int32 startIndex, Int32 count)

何がこの問題を引き起こしているのかわかりません...そして最も奇妙な部分は、それが私のNUnitテスト内でのみ発生することです。このコードが「Console.exe--help」を介して呼び出されると、例外なく正常に実行されます。CSharpOptParseに問題がないので、これは.NETのXslTransformクラスまたはNUnitで問題になる可能性がありますか?

他の誰かがこの問題を経験しましたか?問題を追跡する方法や、より良いライブラリに切り替える方法についてアドバイスはありますか?

4

3 に答える 3

1

私はこれが古い質問であることを知っています。しかし..

ToText()メソッドがコンソールの幅を決定しようとし、実際のコンソールではないものに書き込んでいるときに失敗するため、例外が発生します。

修正は簡単です。固定幅を設定します。

ToText への呼び出しを次のように変更します。

try
{
    usage.ToText(Console.Out, OptStyle.Unix, true);
}
catch
{
    usage.ToText(Console.Out, OptStyle.Unix, true, 90);
}

これで、通常の呼び出しが失敗した場合、フェイルセーフの呼び出しが試みられます。

于 2011-12-29T22:11:01.340 に答える
0

デバッガーを NUnit にアタッチし、First-Chance 例外を有効にして、何が起こっているかを調べてみませんか?

于 2009-01-28T02:00:23.997 に答える
0

私は同じ問題に遭遇し、それを修正したようです (これを行うと発生する問題はわかりませんが、すべて正常に動作するようです)。

探す:

public TextTransformHelper(int maxColumns)
        {
            _maxColumns = maxColumns;

            if (_maxColumns == -1)
            {
                // try to determine console width
                string os = Environment.GetEnvironmentVariable("OS");

                if (os != null && os.StartsWith("Win"))
                {
                    ConsoleUtils.ConsoleHelper ch = new ConsoleUtils.ConsoleHelper();
                    _maxColumns = ch.GetScreenInfo().Size.X;
                }
            }
        }

次に、次のように変更します。

public TextTransformHelper(int maxColumns)
    {
        _maxColumns = maxColumns;

        if (_maxColumns == -1)
        {
            // try to determine console width
            string os = Environment.GetEnvironmentVariable("OS");

            if (os != null && os.StartsWith("Win"))
            {
                ConsoleUtils.ConsoleHelper ch = new ConsoleUtils.ConsoleHelper();
                _maxColumns = ch.GetScreenInfo().Size.X;
                if(_maxColumns == 0) //added
                    _maxColumns = -1; //added
            }
        }
    }

爆破された理由は、FormatText関数に、列幅が定義されていないか-1の場合にヒットするはずの次のifステートメントがあるためです。私にとっての関数は常に 0 を返すため、以下の if ステートメントがヒットせず、「ArgumentOutOfRange」例外が発生します。これは Windows Server 2008 にありました。

if (_maxColumns == -1)
                {
                    output.Append((first) ? indentStr : handingIndentStr);
                    output.Append(line);
                    output.Append(Environment.NewLine);
                    first = false;
                    continue;
                }

「ext:FormatText」の失敗エラーを確認し、すべての FormatText 関数 (xslt が C# 関数を呼び出していた) にブレークポイントを設定し、例外を調べてさらにデバッグすることでデバッグできました。

これが役立つことを願っています。

ジョン・レネマイヤー

于 2009-07-08T17:18:52.217 に答える