2012-06-04 4 views
3

C# 소스 코드 파일 (복잡한 .CS 파일 하나가 아닌 .CS 파일)을 사용하는 프로그램을 작성하고이 프로그램에서 해당 소스 코드를 분석하고 그 결과로 .NET DLL이 수행하는 작업을 알려주고 싶다고 가정 해 보겠습니다. 해당 소스 파일에서 사용되는 메소드가 필요합니다. 이것은 기술적으로 가능한가?소스 코드가 있으면 .NET DLL이 필요한 것을 찾을 수 있습니까?

그래서 예를 들어 해당 소스 파일에 나는 "가 mscorlib.dll"이 필요하다는 것을 말해 할 수 있도록하려면 만 Console.Writeline() 방법이 있다면.

+1

어떤 목적으로? – jrummell

+1

'using' 지시어를 읽어서는 안될까요? –

+3

@nadirs : 아니요. .NET 네임 스페이스는 어셈블리와 많은 관계가 있습니다. 예를 들어'using System.Collections.Generic;'을 보면 어떤 어셈블리 (DLL)가 필요합니까?정보가 충분하지 않습니다. –

답변

4

이렇게하려면 기본적으로 컴파일러를 작성해야합니다. 어떤 DLL이 필요한지 결정하는 유일한 방법은 먼저 소스 파일의 식별자/이름이 바인딩되는 대상을 결정하는 것입니다. 어떤 이름을 바인딩했는지 설정하면 필요한 DLL을 선택할 수 있습니다 (선택할 DLL 목록이 있다고 가정).

는 하지만 프로그램이 이해할 필요 바인딩

이해 이름 ...

  • 의 C# 구문
  • 이름 바인딩 규칙
  • 과부하 해상도 규칙 한마디로

, 당신은 컴파일러를 필요 :)

+0

감사합니다. 이건 어때? http://msdn.microsoft.com/en-us/magazine/cc163641.aspx? 아직 공부하지는 않았지만 이제 인터넷 검색으로 찾았습니다! – Bohn

+2

@BDotA이 프로그램은 컴파일 된 어셈블리를보고 있습니다. 컴파일 된 어셈블리에서 모든 이름은 정규화되어 있으므로 이미 참조 분석과 소스 코드 분석의 문제가됩니다. – JaredPar

+0

아 Ok 확인해 주셔서 감사합니다 ... – Bohn

3

모든 using 줄을 사용하여 어떤 네임 스페이스가 사용되는지 확인할 수 있습니다. 그런 다음 리플렉션을 사용하여 해당 네임 스페이스에 형식을 구현하는 어셈블리를 결정할 수 있지만 일대일 관계는 아닙니다 일대 다 관계) 네임 스페이스와 어셈블리 사이의 관계는 기껏해야 필요한 어셈블리가 아니라 필요한 어셈블리 만 알려줄 수 있습니다. 그렇게하기까지 고려해야 할 모든 가능한 어셈블리 목록이 필요하므로 리플렉션을 통해 네임 스페이스를 분석 할 항목을 파악할 수 있습니다.

4

다음 예제를 고려하십시오.

using A; 
static void Main(string[] args) 
{ 
    Customer c = new Customer(); 
} 

//AssemblyA.dll 
namespace A { public class Customer { } } 

//AssemblyB.dll 
namespace A { public class Customer { } } 

이 경우 코드 샘플에 필요한 어셈블리를 알 수있는 방법이 없습니다. 이상적으로는 어셈블리 목록을 코드 파일과 함께 사용하는 것이 좋으므로 형식을 찾을 위치를 항상 알고 있어야합니다.

이 문제의 오류가 발생하기 쉬운 솔루션은 네임 스페이스/형식 조합과 일치하는 첫 번째 어셈블리를 가져 와서 코드 파일의 모든 클래스를 찾는 것일 수 있습니다.

using A; 
using B; 
static void Main(string[] args) 
{ 
    Customer c = new Customer(); 
} 

//AssemblyA.dll 
namespace A { public class Customer { } } 
//AssemblyB.dll 
namespace B { public class Customer { } } 

내가 같은 코드 파일을 구문 분석 할 때 참조하는 어셈블리의 목록을 포함 항상 것입니다 : 당신이 바로 그 일이있는 경우 그러나이 경우에도 당신은 확신 할 수 없다.

+0

우수 포인트. 누가 당신을 싫어했는지, 왜 그런지 모르겠지만 +1 투표로 다운 투표를 상쇄해야한다고 느꼈습니다! –

+0

감사합니다. 예, 저는 런타임에 CodeDOM으로 파일을 컴파일하고 싶었습니다.하지만 먼저 소스 코드에서 어셈블리를로드해야했기 때문에 런타임에 소스 코드를보고 어셈블리를 찾을 수있는 방법이 있는지 생각했습니다. 어떤 방법이없는 것처럼 보입니다 ... 그래서 나는 유명한 어셈블리들을 방금 들여 놓을지도 모른다. – Bohn

2

CodeDOM에 대해 모르겠지만 C# 컴파일러 (csc.exe)는 최종 코드를 생성 할 때 필요하지 않은 어셈블리 참조를 무시할만큼 똑똑합니다.

GAC에서 적절한 아키텍처의 어셈블리를 열거하고 모두 추가하여 컴파일러가 정렬하도록 할 수 있습니다.

+0

지난번에 내가 확인한 CodeDom은 내부적으로 csc.exe를 사용했기 때문에 이것에 관해서도 똑같이 행동해야한다. – svick