이것은 어떻게하는지에 대해 당황 스러웠습니다. 원래는 로깅을 구성하고 구성 요소를 사용하여 주 응용 프로그램에로드하는 사용자 지정 WebProxy를 만들어서이를 달성 할 수 있다고 생각했습니다. 그러나 코드가 필요한 경우 (이 경우 HTTP 요청이 사용되는 경우)에만 실행된다는 점에서 다른 구성 제안과 동일한 문제가 발생하므로 원래 응용 프로그램을 변경해야합니다.
나는 접근법을 바꾸어서 그것을 달성했다. 로깅을 구성하기 위해 원래 응용 프로그램을 가져 오는 대신 로깅을 구성하는 응용 프로그램의 스텁을 작성한 다음 원래 응용 프로그램을 시작할 수 있습니다.
I는 윈폼 애플리케이션이 그 엔트리 포인트이다 Forms.exe
호출있다 : 예로서
(I는 콘솔 애플리케이션으로 있음) 내 스터브 애플리케이션에서 [STAThread]
internal static void Main()
{
Application.Run(new MainForm());
}
, I 로깅을 구성한 다음로드하고 실행하십시오. Forms.exe
:
internal static void Main()
{
ConfigureLogging()
Assembly app = Assembly.LoadFrom(@".\Forms.exe");
app.EntryPoint.Invoke(null, null);
}
T 그의 리플렉션을 사용하여 다른 애플리케이션을 로깅을 구성하는 애플리케이션으로로드합니다.
주의 사항 : 다른 응용 프로그램이 당신이 올바른을 해결하기 위해 다른 응용 프로그램을 검사하는 반사판을 사용해야 할 수도 있습니다이 방법
를로드하기 위해 .NET 응용 프로그램이어야한다
- 진입 점에 전달할 인수 (즉,
string[] args
이 걸리면 null
대신 인수가 빈 string[]
을 전달해야 할 수 있습니다. - 다른 응용 프로그램을 실행하는 동안 원래 응용 프로그램의 콘솔 창이 중단됩니다 (문제가 아닌 경우). FreeConsole을 사용하여 숨길 수 있습니까?)
나에게 전화를 걸지 만, 로깅 도구가 정적 초기화 블록에서 어딘가에 초기화되지 않는 이유는 무엇입니까? –
이 코드를 호출하기 위해 빌드되지 않은 응용 프로그램에이 코드를 주입하는 것이 중요합니다. 클래스의 코드가 사용되기 전에는 정적 생성자 만 sometime *이라고 불립니다. 실제로 클래스를 사용하지 않는 경우에는 호출되지 않습니다. 응용 프로그램에서 내 injection-dll을 전혀 사용하지 않기 때문에 정적 생성자는 호출되지 않습니다. –