2009-09-30 3 views
14

저는 매우 큰 프로젝트 (16 개의 프로젝트가 들어 있고 각 프로젝트에는 약 100 개의 파일이 들어있는 솔루션)로 작업하고 있습니다.프로젝트에서 불필요한 리소스를 제거하려면 어떻게합니까?

Visual Studio 2005를 사용하여 C++/C#로 작성되었습니다.
프로젝트 중 하나에는 실제로 약 400 개만 사용되는 약 2000 개의 리소스가 있습니다.
사용하지 않는 리소스는 어떻게 제거합니까?

사용 된 것들을 검색하여 작업을 시도했습니다.
그것은 효과가 있었지만 솔루션을 빌드 할 수 있었지만 런타임에 문제가 발생했습니다.

enum이 사용 된 것 같습니다. (중요)

어떻게 내가 런타임에 침입하지 않도록 할 수 ?

편집 :
내가 (어떻게 든) 런타임에 즉석에서 (즉, 찾을 수없는) 하나 개의 방법이 리소스를 생성 할 수 있었다 생각합니다.
그러나 나는 ... 무엇이든에 관하여 잘 모른다.

참고 : 몇 가지 불필요한 리소스가 아직 있으면 괜찮습니다.

+1

resx 파일 정리를 의미하는 경우 SharpDevelop에는 이러한 기능이 있습니다. (http://www.sharpdevelop.net) –

+0

C++에서 작동합니까? –

+0

"매우 큰"1600 개의 소스 파일이있는 시스템을 호출하지 않겠습니다. 적당히, 아마도,하지만 "매우 큰"것은 아닙니다. 또 다른 0을 추가하면 "매우 큽니다". – JesperE

답변

4

소스 코드를 검색하는 사용자 지정 도구를 작성합니다.

당신은 헤더 파일에서 자원 ID (즉, 아마도라는 및 Resource.h)를 제거한 다음 다시 컴파일 및 더 경고를 얻을 경우 : 그 좋은 일입니다.

다음은 앱을 작성하는 방법입니다. 당신이 조사하고자하는 리소스 파일 (resource.h)을 입력으로받습니다. 헤더 파일 (* .h)을 열고 모든 리소스 상수 (또는 관심있는 적어도 onces)를 구문 분석하십시오. 나중에 조회 할 수 있도록 해시 테이블에 저장합니다. 프로젝트의 각 코드 파일에 대해 텍스트에서 각 리소스 ID의 인스턴스를 검색하십시오. 자원 ID가 사용되면 해쉬 테이블의 값을 증가시키고 그렇지 않으면 0으로 남겨 둡니다. 결국, 로그 파일 등을 제외한 모든 리소스 ID를 덤프하십시오. 그런 다음 실제로 지정된 자원 ID를 안전하게 제거 할 수 있는지 테스트하십시오. 일단 그렇게하면 로그 파일의 결과에 지정된 리소스 ID를 제거하는 다른 도구를 작성하십시오.

당신은 펄 이러한 도구를 쓸 수 있으며 약 0.3 초에서 실행됩니다 : 그러나 디버깅 할 일이 걸릴 것입니다. :) 또는이 글을 쓸 수 있습니다.NET을 실행하면 약간 느리게 실행되지만 디버깅에는 1 시간이 소요됩니다. :)

+1

매우 차가운 :-) + 1A –

0

Find Unused Resources in a .NET Solution 여기에 도움이 될까요? 기본적으로 어떤 리소스가 사용되는지 (예 : 포괄적 인 코드 커버리지 검사) 확인하고 사용하지 않는 리소스를 제거해야합니다.

아마 청소 및 추적 오류 접근법을 사용하여 두려워해서는 안됩니다.

+0

나는 이것을했다. 하지만 :( –

1

Visual Studio 용 타사 플러그인을 ReSharper으로 사용할 수 있습니다. 이 추가 기능은 C# 코드를 분석하고 사용되지 않는 리소스를 지적합니다. 하지만 C#에서만 작동합니다.

1

C++ 프로젝트의 경우 Riverblade의 ResOrg을 확인하십시오.

"Resource ID Organizer (ResOrg)는 Visual C++ 용 추가 기능으로 Windows 응용 프로그램의 개발/유지 관리 중 가장 귀찮은 (불필요한) 작업 중 하나 인 리소스 기호 ID 값 유지"

솔루션 탐색기에서

http://www.riverblade.co.uk/products/resorg/index.html

0

, 마우스 오른쪽 버튼을 클릭하고 참조에 및 종속 코드 찾기 메뉴 항목을 클릭합니다.

종속 코드를 찾을 수없는 경우이 참조를 프로젝트에서 제거 할 수 있습니다. ( 제거 작업도 마우스 오른쪽 버튼 클릭 메뉴 아래에 있습니다.)

편집 : 대규모 프로젝트의 경우, 찾기 종속 코드 작업은 시간이 소요됩니다. 그래서 당신은 가장 가능성 값 내가 나쁜 하나를 본 적이이 아마 하지 실행 가능한 옵션입니다 시간 ....

1

2000 자원을 보유하고 있기 때문이다. 컴파일 된 프로그램의 나의 방법은 GREP를 에뮬레이트하는 REXX 스크립트를 사용하여 사용하지 않는 것으로 의심되는 소스에 대한 참조를 찾고, 프로그램에서 제거하고 무엇이 손상되는지 확인하는 것입니다. 검색하려는 파일 목록을 사전 필터링 할 수 있으므로 REXX 스크립트를 사용합니다. 폴더와 컴퓨터에서 검색 할 수 있습니다.

1

도구 Reflector (무료)을 살펴보고 ReSharper (값 비싼)과 혼동하지 않아도됩니다. 어떤 DLL이 다른 DLL에 종속되는지를 보여줄 수 있습니다. 그런 다음 원하는 경우 다른 것으로 참조되지 않는 DLL을 제거 할 수 있습니다. 의존성 주입이나 리플렉션을 사용하고 있는지 잘 모르는 채로 코드를 깨뜨릴 수 있는지 조심하십시오.

반사판 : http://www.red-gate.com/products/reflector/.

이 추가 기능은 어셈블리 종속성 그래프와 IL 그래프를 그립니다. http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph. 코드가 실행시 자원의 동적 로딩 (예를 통해 문자열)가 포함 된 경우

+1

반사경은 더 이상 무료가 아닙니다. (맥주) – Bobby

1

는 자동으로 자원을 안전하게 소스에서 제거 할 수있는 결정하는 방법이 없습니다. 동적로드 문은 모든 리소스를로드 할 수 있습니다.

가장 좋은 방법은 응용 프로그램의 당신의 아래 손질 버전으로 시작을 실행하고 당신이 그것을 테스트 할 때 자원이 누락 식별하는 것입니다. 그런 다음 다시 추가하고 다시 테스트하십시오.

C++ 자원의
0

, 당신은 "자원보기"에서 프로젝트를 마우스 오른쪽 단추로 클릭 한 다음 옆에 눈금이없는 사람을 삭제하려고 했습니까? 사용되지 않은 대화 상자 리소스는 코드에서 "열거 형"으로 참조되므로 삭제하는 것은 안전하지 않습니다 (다음과 같이).

enum { IDD = IDD_ABOUTBOX }; 

.. 다른 모든 경우에도 안전해야합니다.

1

솔루션 탐색기의 "리소스보기"에서 마우스 오른쪽 단추를 클릭하고 "리소스 기호"를 선택하십시오. 이제 어떤 리소스 상수가 .RC 파일에서 사용되는지 확인할 수있는 목록을 얻습니다. 이렇게하면 Resource.h를 정리하는 데 약간의 도움이 될 수 있습니다 (실제 C++ 코드에서 사용되지 않는 리소스가 표시되지는 않지만).

관련 문제