-5

私は本当に奇妙な「バグ」を抱えており、それが何なのか見当もつきません。アプリは .net 4 フレームを使用して VS2010 で作成されています。通常のアセンブリに加えて、MS 相互運用機能を Excel に使用します。クライアント マシンに Office 2010 がインストールされています。

基本的に、アプリはExcelシートを解析し、結果で別のもの(新しいファイル)を作成します。問題: exe ファイルをデスクトップ (または PC の他の場所) にコピーすると、例外がスローされますが、アーカイブ (RAR) にあり、アーカイブがデスクトップにある場合、完全に機能します。

彼らは非常に制限的なシステム(電話会社)を持っており、そのアプリはまったく使用されるべきではないため、インストールできません。(手動で解析している労働者は、通常、プログラムが5秒で処理するのに3時間かかるため、上司はそれを知ることができません.

問題は会社内の他のマシンでも持続するため、孤立したケースではありません。

それに関する情報は高く評価されます。PSさらに情報が必要な場合は、叫び声を上げてください。ハンドルされていない例外の「詳細」は次のとおりです。

このダイアログ ボックスの代わりに Just-In-Time (JIT) デバッグを呼び出す方法の詳細については、このメッセージの最後を参照してください。

************** 例外テキスト ************** System.ArgumentOutOfRangeException: インデックスと長さは、文字列内の場所を参照する必要があります。パラメータ名: System.String.InternalSubStringWithChecks での長さ(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) で System.String.Substring(Int32 startIndex, Int32 length) で ExcelSvjetlana.Form1.buttonObradi_Click(オブジェクト送信者, EventArgs e) で System.Windows .Forms.Control.OnClick(EventArgs e) で System.Windows.Forms.Button.OnClick(EventArgs e) で System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) で System.Windows.Forms.Control.WmMouseUp(Message& m、MouseButtons ボタン、Int32 クリック) System.Windows.Forms.Control.WndProc(Message& m) で System.Windows.Forms.ButtonBase.WndProc(Message&

************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.239 (RTMGDR.030319-2300)
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
ExcelSvjetlana
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Users/sobradovic/Desktop/Interno.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.276 built by: RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.258 built by: RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Data
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Numerics
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
   CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
----------------------------------------
Microsoft.Office.Interop.Excel
    Assembly Version: 14.0.0.0
    Win32 Version: 14.0.4756.1000
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.Office.Interop.Excel/14.0.0.0__71e9bce111e9429c/Microsoft.Office.Interop.Excel.dll
----------------------------------------
office
    Assembly Version: 14.0.0.0
    Win32 Version: 14.0.4760.1000
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/office/14.0.0.0__71e9bce111e9429c/office.dll
----------------------------------------
Microsoft.CSharp
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.CSharp/v4.0_4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll
----------------------------------------
System.Dynamic
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Dynamic/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll
----------------------------------------
Anonymously Hosted DynamicMethods Assembly
    Assembly Version: 0.0.0.0
    Win32 Version: 4.0.30319.239 (RTMGDR.030319-2300)
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/mscorlib/v4.0_4.0.0.0__b77a5c561934e089/mscorlib.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

そして、これがあなたが求めたコードです。いくつかの弦を変更したことに注意してください。

private void buttonObradi_Click(object sender, EventArgs e)
{
    int brojac = 0;
    string grade = "";
    string grading1 = "2";
    string grading2 = "3";
    string grading3 = "4";
    string grading4 = "1";
    string grading5 = "No Answer";
    string grading6 = "5";
    string grupa = "";
    bool citaj = false;
    bool mozda = false;
    string odjel = "";
    string pododjel = "";
    string ocjenica = "";
    int prviProlaz = 0;

    foreach (DataRow redak in excelData.Rows)
    {
        if (prviProlaz > 0)
        {
            if (brojac == 0)
            {
                brojac = 1;
                grupa = redak[1].ToString();
                mozda = false;
                citaj = false;
            }
            else
            {
                if (redak[1].ToString() == "")
                {
                    mozda = true;
                    citaj = false;
                }
                else
                {
                    if (redak[1].ToString() == "Agent Name")
                    {
                        citaj = true;
                    }
                    else if (redak[1].ToString() == grading1 || redak[1].ToString() == grading2 || redak[1].ToString() == grading3 || redak[1].ToString() == grading4 || redak[1].ToString() == grading5 || redak[1].ToString() == grading6)
                    {
                        grade = redak[1].ToString();
                        mozda = false;
                    }
                    else if (mozda == true)
                    {
                        brojac = 0;
                    }
                    else if (citaj == true)
                    {
                        if (grupa == "Team A" || grupa == "Team M" || grupa == "Team T")
                        {
                            pododjel = "AAAA";
                            odjel = "CCCC";
                        }
                        else if (grupa == "Team 1" || grupa == "Team 2")
                        {
                            pododjel = "BBBB";
                            odjel = "TTTT";
                        }
                        else if (grupa == "K Team" || grupa == "F Team")
                        {
                            pododjel = "RRRR";
                            odjel = "SSSS";
                        }
                        else if (grupa == "Group 1" || grupa == "Group 2" || grupa == "Group 3" || grupa == "Group 4")
                        {
                            pododjel = "FFFF";
                            odjel = "TTTTT";
                        }
                        else if (grupa == "Fun group 1" || grupa == "fun group 2" || grupa == "fun group 3" || grupa == "fun group 4" || grupa == "fun group 5")
                        {
                            pododjel = "KKKK";
                            odjel = "FFFF";
                        }
                        ocjenica = ocjenica.Trim();

                        preSort.Rows.Add(redak[0].ToString(), redak[1].ToString(), "", grade, Convert.ToDecimal(redak[4].ToString()), grade.Substring(0, 1), grupa, pododjel, odjel);
                    }
                }
            }
        }
        else
        {
            prviProlaz = 1;
        }
    }
    dataGridView2.DataSource = preSort;
}
4

7 に答える 7

4

あなたが抱えている問題はSubstring、無効なパラメータを使用した操作のようです。それはとにかくエラーです。

そのコード行は何をしているのbuttonObradi_Clickですか?おそらく、あなたが抱えている問題は、開きたいファイルへの誤った相対パスが原因です。または、exeのパスである可能性が高くなります。たとえば、4番目のバックスラッシュを検索し、Substringそこから実行します... exeが4つ未満のバックスラッシュのパスにある場合は、問題が発生します:)単なる例です。

編集:事実は、Substringエラーを生成します、そしてあなたのコードの唯一の部分文字列はですgrade.Substring(0, 1)。したがって、グレードは空である必要があります。これは一部のマシンでのみ発生するとおっしゃっていますが、私の推測では、そのマシンのexcellのフォーマットは異なります。コードから判断できる限り、grade「エージェント名」の前にある行が来ることを期待して、excellを解析します。これは次の場合です。

else if (redak[1].ToString() == grading1 || redak[1].ToString() == grading2 || redak[1].ToString() == grading3 || redak[1].ToString() == grading4 || redak[1].ToString() == grading5 || redak[1].ToString() == grading6)

この行の前に、最初に合格して成績を初期化する必要があります。

if (redak[1].ToString() == "Agent Name")

あなたcitajをtrueに設定します。そうしないと、grade変数が初期化されず、もちろんサブストリングが失敗します。

コード全体を実際にデバッグしていないことを正しく理解したことを願っています。したがって、これが機能していないマシンのエクセルをチェックする必要があると思います。それらが間違っているかどうか、またはそのフォーマットに一致するようにコードを調整する必要があります。しかし、なぜこれがRARから機能し、RARの外部では機能しないのかはまだわかりません。

于 2012-12-04T13:37:40.400 に答える
0

どうやら、Substring()間違ったパラメーターで呼び出しているようです —startIndex小さすぎるか大きすぎる可能性があります。または、lengthどちらが大きすぎるか (または小さすぎるか) です。の .NET 実装にはSubstring常に悩まされていましたstring.EmptySubstring()そのため、コールの前にチェックを挿入したり、...

public static string SubstringFixed(this string str, int startIndex, int length)
{
    if (startIndex >= str.length || startIndex < 0)
    {
        return string.Empty;
    }
    length = Math.Min(length, str.Length - startIndex);
    length = Math.Max(length, 0);

    return str.Substring(startIndex, length);
}

このメソッドをユーティリティ クラスのどこかで宣言し、s.SubstringFixed()代わりに使用します —悪い場合にスローする代わりにs.Substring単に戻ります。""ArgumentOutOfRangeException

ああ、もちろん、文字列を扱うときは、空の文字列を正しく扱うことを常に確認する必要があります...「正しく」が表すものは何でも。通常は、「クラッシュせず、実際には何もしない」だけです。

于 2012-12-04T13:48:13.000 に答える
0

最後に私はそれを手に入れました。それは特権によるものでした。私のアプリケーションはインストールされておらず、フォルダーへの特権がありませんでしたが、Rarにはそれがありました。したがって、エラーが発生しました。どの方法でもディスク上のメモリ領域を使用する理由はまだありません。

私が言ったように、それは文字列関数の問題ではありません。

于 2015-04-28T08:41:12.663 に答える