2010-02-03 5 views
3

일부 로깅을 초기화하고 외부 도구로 전송되는 .NET 클래스 라이브러리를 C#으로 만들었습니다. 라이브러리는 모든 응용 프로그램과 완전히 별개이지만 초기화하기 위해 적어도 하나의 메서드 호출을해야합니다..NET DLL을 app.config를 통해 다른 .NET 응용 프로그램에 "삽입"할 수 있습니까?

app.config에 자동으로 해당 DLL을로드하고 무언가를 호출하는 방법이 있습니까? 어떤 내용이든 내용을 변경할 수 있습니다. 클래스 이름이나 메서드 이름 또는 기타 등등을 지원할 필요가 없습니다.

참고로 app.config 파일을 변경하지 않고 해당 응용 프로그램을 변경하지 않고이 작업을 수행해야합니다.

이것이 가능합니까? 그렇다면 무엇을보아야합니까?

+0

나에게 전화를 걸지 만, 로깅 도구가 정적 초기화 블록에서 어딘가에 초기화되지 않는 이유는 무엇입니까? –

+0

이 코드를 호출하기 위해 빌드되지 않은 응용 프로그램에이 코드를 주입하는 것이 중요합니다. 클래스의 코드가 사용되기 전에는 정적 생성자 만 sometime *이라고 불립니다. 실제로 클래스를 사용하지 않는 경우에는 호출되지 않습니다. 응용 프로그램에서 내 injection-dll을 전혀 사용하지 않기 때문에 정적 생성자는 호출되지 않습니다. –

답변

1

이것은 어떻게하는지에 대해 당황 스러웠습니다. 원래는 로깅을 구성하고 구성 요소를 사용하여 주 응용 프로그램에로드하는 사용자 지정 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을 사용하여 숨길 수 있습니까?)
  • +0

    아, 나에게 떠올랐다. 예, 이것은 훨씬 더 유망한 것으로 들립니다. –

    +0

    이것은 분명히 유일하게 실행 가능한 옵션입니다. ConfigurationSection과 관련된 클래스가로드 될 때를 결정하는 데 사용되는 정확한 규칙을 모르지만 필자가 해당 구성을 터치하면로드되는 것 같습니다. 내 경우에는 일반적인 경우 응용 프로그램이이 구성을 읽지 않기 때문에 작동하지 않습니다. 그러나 스텁 응용 프로그램 프로젝트는 매력처럼 작동합니다. –

    0

    예, 어셈블리의 내용을로드하는 반사를 사용할 수

    +0

    요점은 대상 애플리케이션 코드를 전혀 변경하지 않는 것이 었습니다. 나는 그 길로 가고 싶으면 쉽게 반성 등을 추가 할 수있다. –

    +0

    @Lasse : 흠 ... 타겟 앱이이 앱을 처리하도록 제작되지 않았으므로 앱을 업데이트하고 싶지 않다면 멈추게됩니다. 그게 마술이라면 이것은 보안상의 문제가 될 것입니다. –

    +0

    네, 저도 제 가정입니다. 그리고 구성 섹션 응답을 얻을 수 없기 때문에, 어쨌든 응용 프로그램에 코드가 필요하다고 생각합니다. 아마도 @Brian이 위에 언급 한 디버깅 훅이 대신 작동 할 수 있습니다. –

    2

    그것은 아마 해킹으로 간주하지만, 될 것이다 당신은 당신의 DLL에 ConfigurationSection을 상속 뭔가를 넣어, 당신의 app.config에 해당 구성 섹션을 추가하는 경우 , 이것은 당신이 설정 섹션의 생성자에서 코드를 수행 할 수있게 해줄 것이며, 따라서 당신이 원하는 것을 거의 할 수 있습니다. 물론 응용 프로그램 시작시 한 번만 호출되지만, 충분히 이해할 수 있으면 이해할 수 있습니다.

    +0

    나는 이것을 시험해보고 유망한 소리를 낸다. –

    +0

    해킹이 좋습니다. 이 dll은 모든 로그 메시지를 캡처하기 위해 Debug 및 Trace의 수신기 시스템에 연결하고 메모리 및 CPU 사용을 모니터하는 백그라운드 스레드를 시작하며 모든 것은 외부 로그 프로그램에 전송됩니다. 유감스럽게도 변경할 수없는 응용 프로그램에 사용해야하는 법의학 디버깅 도구입니다. –

    +0

    글쎄, 그때 왜 작동하지 않을지 모르겠다. 그걸로 행운을 빌어 요 어떻게 밝혀 지는지 알려주세요. –

    1

    Snoop 일부 C++ 부두를 사용하여 수행합니다. 다행히 소스는 사용할 수 있습니다 - "ManagedInjector"라는 프로젝트를보십시오

    관련 문제