3

外部ツールに送信されるいくつかのログを初期化する C# で .NET クラス ライブラリを作成しました。ライブラリはアプリケーションから完全に分離されていますが、ライブラリを初期化するには、ライブラリに対して少なくとも 1 つのメソッド呼び出しを行う必要があります。

そのdllを自動ロードし、その中で何かを呼び出すapp.configに何かを入れる方法はありますか? 何にでも合うように内容を変更できます。独自のクラス名やメソッド名などをサポートする必要はありません。

問題のアプリケーションを変更せずにこれを行う必要があることに注意してください.app.configファイルを変更するために保存してください。

これは可能ですか?もしそうなら、私は何を見なければなりませんか?

4

4 に答える 4

2

おそらくハックと見なされるでしょうが、ConfigurationSectionを継承するものをdll に配置し、その構成セクションを app.config に追加すると、構成セクションのコンストラクターでコードを実行できるようになり、ほとんどのことができます。あなたはしたい。もちろん、アプリケーションの起動時に一度だけ呼び出されますが、理解できればそれで十分です。

于 2010-02-03T13:19:11.830 に答える
1

Snoopは、C++ ブードゥー教を使ってこれを行います。幸いなことに、ソースが利用可能です - 「ManagedInjector」という名前のプロジェクトを見てください

于 2010-02-03T13:38:07.243 に答える
1

これは、それを行う方法についてしばらく戸惑いました。私は当初、ロギングを構成するカスタム WebProxy を作成し、それをdefaultProxy構成要素を使用してメイン アプリケーションにロードすることで実現できると考えていました。ただし、これには、コードが必要な場合 (この場合は HTTP 要求が使用される場合) にのみ実行されるという点で、他の構成の提案と同じ問題があり、元のアプリケーションを変更する必要があります。

アプローチを逆にすることでそれを達成しました。元のアプリケーションでログを構成する代わりに、ログを構成してから元のアプリケーションを起動するアプリケーションのスタブを作成できます。

例として:

Forms.exeエントリポイントが次のように定義されている WinForms アプリケーションがあります。

[STAThread]
internal static void Main()
{
    Application.Run(new MainForm());
}

私のスタブ アプリケーション (コンソール アプリケーションとして持っている) で、ログを構成し、ロードして実行しますForms.exe

internal static void Main()
{
    ConfigureLogging()
    Assembly app = Assembly.LoadFrom(@".\Forms.exe");
    app.EntryPoint.Invoke(null, null);
}

これは、リフレクションを使用して、ロギングを構成するアプリケーションに他のアプリケーションをロードします。

警告:

  • この方法でロードするには、他のアプリケーションが .Net アプリケーションである必要があります。
  • Reflector を使用して他のアプリケーションを検査し、エントリ ポイントに渡す正しい引数を見つける必要がある場合があります (つまり、引数としてa ではなくstring[] args空を渡す必要がある場合があります) 。string[]null
  • 元のアプリケーションのコンソール ウィンドウは、他のアプリケーションの実行中にハングアップします (これはおそらく問題ではありませんが、問題がある場合はFreeConsoleを使用して非表示にすることができます) 。
于 2010-02-03T23:36:48.070 に答える
0

はい、リフレクションを使用してアセンブリのコンテンツをロードできます

于 2010-02-03T13:15:26.520 に答える