4

短いバージョン: プログラムが実行時に独自のソース コードに (読み取り専用で) アクセスできるようにしたい。コンパイル中にソース コードを dll に自動的にパッケージ化する方法はありますか?

長いバージョン:

背景は、例外が発生したときに、何が起こったのかの詳細を含むファイルを自動的に作成したいということです。このファイルには、特に、問題の原因となった関数のソース コードが含まれている必要があります。このファイルを電子メールで他の人に送信したいのですが、受信者は Visual Studio を持っていない (またはインストールしたくない) 可能性が高いため、シンボル サーバーなどを使用するものは問題外です。プレーンテキストファイルである必要があります。

理想的には、関連するソース コード ファイルをどこかで見つけて、関連する行をコピーするだけです。ソース コード全体を含むフォルダーがあれば、目的のファイルと行を見つけることができると考えて間違いありません。

これまでに思いついた最良のアイデアは、MSBuild ファイルを変更して、コンパイル中にソースの .zip を作成し、必要とすることです。 .dll と .zip を同じフォルダーに配置します。

私が見つけたスタックオーバーフローに関する似たような質問のほとんどは、 .dll ファイルの逆コンパイルを扱っているようですが、これは私がやりたいことではありません。ソース コードを持っており、便利な方法で .dll と一緒に出荷したいと考えています。

更新: 本当に長いバージョン

なぜ私がそれをやりたいの真剣に疑問に思っている人がいるようです. その他のソフトウェアにはGUIがあります。簡単な例として、他のソフトウェアが標準の Windows 電卓であるとすると、テストケースは次のようになります。

calculator.Open();
calculator.EnterValue(13);
calculator.PressButtonPlus();
calculator.EnterValue(38);
calculator.PressButtonEnter();
int value = calculator.GetDisplayedValue();
Assert.That(value == 51);
calculator.Close();

これらのテストは、非常に人間が読める方法で意図的に書かれています。

問題が発生したときに私がやりたいことは、計算機の開発者に問題の再現方法の詳細な説明を提供することです. (この例では、彼は電卓を開き、13 を入力し、プラスを押します。)

別のオプションとして、各関数がcalculator.Something()情報行をログに書き出すようにすることもできますが、それは a) より多くの作業が必要になる、b) 中止された時点までのテスト実行のみを含める、c) リスクを負う1つの関数で行を書き忘れているため、実行された内容が正しく表現されていません。しかし、私はソース コードをコピーする以外の解決策にもオープンです。

4

3 に答える 3

2

この質問を見てください: __LINE__ __FILE__ に相当するものは C# に存在しますか?

C++ は、コンパイル時に情報を表すものに置き換えるマクロ ( __LINE__、など) を提供します。__FILE__これは、次のように記述した場合を意味します。

throw new CException(__FILE__);

次のようにコンパイルされます。

throw new CException("test.cpp");

ハードコードされた値になります。C# コンパイラはこれらのマクロを提供しないため、リフレクションを使用して、例外がスローされた場所に関する情報を取得する必要があります。それを行う方法は、上記のリンクされた質問に記載されています。

.pdbシンボルを提供できない場合、 Exception.ToString()(またはStackTrace.ToString()) の既定の動作では、行番号は返されませんが、失敗した操作の MSIL オフセットが返されます。私が覚えている限りでは、ReSharper のスタック トレース エクスプローラーを使用して、代表的なコードに移動できます (100% 確実というわけではありませんが、この事実に言及したスタック オーバーフローに関する質問もありました)。

于 2013-01-09T14:01:30.967 に答える
1

ソース ファイルのコピーをリソースとして含めることができます。

  • プロジェクト フォルダーに、 という名前のサブフォルダーを作成しますResources。そこにソースファイルをコピーします。
  • プロジェクトでリソース ファイルを作成し、作成したソース コピーをそのファイルに含めます。
  • 実際のソース ファイルをResourcesフォルダーにコピーするビルド前イベントをセットアップして、常にコピーを更新します。私が作成した例では、これはうまくいきました:

    copy $(ProjectDir)*.cs $(ProjectDir)Resources
    
  • コードで、次のようなファイルのコンテンツを取得できるようになりました (リソース ファイルの名前は次のようになりますResource1.resx

    // Get the source of the Program.cs file.
    string contents = Resource1.Program;
    

プロジェクトは次のように終了しました。

プロジェクトツリー

于 2013-01-09T14:49:12.327 に答える
0

はい、MSBuild 中にソースを .zip などに圧縮し、その .zip をアプリケーション/dll と一緒にパッケージ化することもお勧めします。実行時に例外が発生すると、Aschratt が説明するようにファイルとメソッド名を取得し、.zip からファイルを抽出して、その中のメソッドを見つけます。

于 2013-01-09T14:45:33.503 に答える