CAFE

익명공부전달방

메타데이터 파일을 찾을 수 없습니다.

작성시간07.11.23|조회수3,115 목록 댓글 6
요즘 진행 중인 프로젝트에서 배포만 하고 나면 메타데이터 파일을 찾을 수 없습니다.
라는 에러 메세지가 나와서 오류 코드로 MS 사이트에서 검색을 했더니 아래와 같은 내용을 찾을 수
있었습니다.
그런데 저는 당췌 무슨 얘기인지 이해가 가질 않습니다.
약간 쉽게 설명 좀 해주실 수 있는지요?
 
 
------------------------------------------------------------------------------------
컴파일러 오류 CS0006

오류 메시지

'dll_name' 메타데이터 파일을 찾을 수 없습니다.
Metadata file 'dll_name' could not be found

프로그램을 컴파일했고 메타데이터를 포함하고 있는 파일의 이름을 명시적으로 전달했지만 .dll을 찾을 수 없습니다. 자세한 내용은 /reference(메타데이터 가져오기)(C# 컴파일러 옵션)를 참조하십시오.

-------------------------------------------------------------------------------------
C# 언어 참조
/reference(메타데이터 가져오기)(C# 컴파일러 옵션)

/reference 옵션을 사용하면 컴파일러에서 지정된 파일에 있는 public(C# 참조) 형식 정보를 현재 프로젝트로 가져오므로 지정한 어셈블리 파일에 있는 메타데이터를 참조할 수 있습니다.

/reference:[alias=]filename
/reference:filename
var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl1057047c3,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl10img,"; 설명설명

여러 파일에서 가져오려면 각 파일에 대해 별도의 /reference 옵션을 사용합니다.

가져오는 파일에는 매니페스트가 포함되어야 하며, 출력 파일은 /target:module(어셈블리에 추가할 모듈 만들기)(C# 컴파일러 옵션) 대신 /target(출력 파일 형식 지정) (C# 컴파일러 옵션) 옵션 중의 하나로 컴파일되어 있어야 합니다.

/r/reference의 약식 표현입니다.

어셈블리 매니페스트가 없는 출력 파일에서 메타데이터를 가져오려면 /addmodule(메타데이터 가져오기) (C# 컴파일러 옵션)을 사용합니다.

다른 어셈블리(어셈블리 B)를 참조하는 어셈블리(어셈블리 A)를 참조할 때 다음과 같은 경우에는 어셈블리 B를 참조해야 합니다.

  • Assembly A에서 사용하는 형식이 Assembly B에서 상속한 형식이거나 Assembly B의 인터페이스로 구현된 경우

  • Assembly B의 반환 형식이나 매개 변수 형식을 가진 필드, 속성, 이벤트 또는 메서드를 호출하는 경우

하나 이상의 어셈블리 참조가 있는 디렉터리를 지정하려면 /lib(어셈블리 참조 위치 지정) (C# 컴파일러 옵션)를 사용합니다. /lib 항목에서는 컴파일러가 어셈블리를 검색하는 디렉터리에 대해서도 설명합니다.

모듈이 아니라 어셈블리에 있는 특정 형식을 컴파일러에서 인식할 수 있도록 하려면 컴파일러에서 해당 형식을 확인할 수 있게 해야 합니다. 이를 위해 해당 형식의 인스턴스를 정의합니다. 컴파일러는 다른 방법을 사용하여 어셈블리에서 형식 이름을 확인할 수 있습니다. 예를 들어, 어셈블리에서 특정 형식을 상속하면 해당 형식 이름이 컴파일러에 전달됩니다.

경우에 따라 하나의 어셈블리 내에 있는 동일한 구성 요소의 두 가지 버전을 참조해야 할 수도 있습니다. 이렇게 하려면 각 파일에 대한 /reference 스위치에 별칭 하위 옵션을 사용하여 두 파일을 구별합니다. 이 별칭은 구성 요소 이름에 대한 한정자로 사용되며 파일 중 하나에 있는 구성 요소로 확인됩니다.

일반적으로 사용되는 .NET Framework 어셈블리를 참조하는 csc 지시 파일(.rsp)이 기본적으로 사용됩니다. 컴파일러에서 csc.rsp를 사용하지 않도록 하려면 /noconfig(csc.rsp 무시) (C# 컴파일러 옵션)를 사용합니다.

자세한 내용은 참조 추가 대화 상자를 참조하십시오.

예제

이 예제에서는 extern alias(C# 참조) 기능을 사용하는 방법을 보여 줍니다.

소스 파일을 컴파일하고 이전에 컴파일한 grid.dllgrid20.dll에서 메타데이터를 가져옵니다. 이러한 두 DLL에는 동일한 구성 요소의 개별 버전이 들어 있으므로 별칭 옵션과 함께 두 개의 /reference를 사용하여 소스 파일을 컴파일합니다. 옵션은 다음과 같습니다.

/reference:GridV1=grid.dll and /reference:GridV2=grid20.dll

이렇게 하면 extern 문을 통해 프로그램에서 사용할 수 있는 외부 별칭 "GridV1" 및 "GridV2"가 설정됩니다.

extern GridV1;
extern GridV2;
// Using statements go here.

이 작업을 마치면 다음과 같이 컨트롤 이름 앞에 GridV1을 사용하여 grid.dll에 있는 grid 컨트롤을 참조할 수 있습니다.

GridV1::Grid

또한 다음과 같이 컨트롤 이름 앞에 GridV2를 사용하여 grid20.dll에 있는 grid 컨트롤을 참조할 수도 있습니다.

GridV2::Grid 
var ExpCollDivStr = ExpCollDivStr; ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl21734d486,"; var ExpCollImgStr = ExpCollImgStr; ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl21img,"; 참고 항목참고 항목
다음검색
현재 게시글 추가 기능 열기
  • 북마크
  • 신고하기

댓글

댓글 리스트
  • 작성시간 07.11.26 "메타데이터 파일을 찾을 수 없습니다."이 메세지로 검색한것이 csc를 찾으신 건가요? 저 메세지를 보아서는 서버에 배포를 하였는데 참조하는 dll이 없는 경우 발생했을거 같은데요. aaa.dll이 bbb.dll, ccc.dll을 참조하고 있을때 aaa.dll을 서버에 배포하고 bbb.dll, ccc.dll을 배포하지 않는 경우 같습니다. 그런데 aaa.dll에서 bbb.dll을 참조만하고 사용하지 않았다면 에러는 나지 않습니다. 서버에 리플렉터로 aaa.dll을 올리고 Reference를 보면 ccc.dll이 로드되는지 확인해보세요. 간단하게 확인가능합니다. MS계열은 이벤트로그에 에러를 기록하여 주기때문에 해당 컴퓨터의 이벤트로그를 보시는것이 가장좋겠습니다.
  • 답댓글 작성자 본인 여부 작성자 작성시간 07.11.26 말씀하신대로 dll 파일이구요. 건드리지도 않은 dll 파일이 자꾸 저렇게 나옵니다. 배포는 웹프로젝트 클릭하고 솔루션 탐색기 위에 있는 파일복사 메뉴를 사용한적도 있고. 수정한 dll, 과 aspx 파일만 복사한적도 있습니다.(로컬 경우. 서버로는 이 로컬 파일을 복사 했습니다.)
  • 답댓글 작성자 본인 여부 작성자 작성시간 07.11.26 다음 배포 때 이벤트 로그를 참조해 봐야 겠네요. 돌도끼님 감사합니다. (참 그런데 서버에 리플렉터로 aaa.dll을 올리고 Reference를 보면 이라는게 어떻게 하는건지 잘 모르겠는데. 좀 더 구체적인 설명 좀 부탁 드려도 될까요? ^^;)
  • 작성시간 07.11.26 캡처떠서 답글달다가 포기했네요.. 꼬리에 꼬리를 물고 너무 많아져서... 리플렉터를 쓰라고 한것은 Dependency Walker쓰듯이 쓰라는 것입니다. dll이 참조하고 있는 dll이 로드가능한 위치에 있는지를 확인하라는 것입니다.
  • 답댓글 작성자 본인 여부 작성자 작성시간 07.11.27 돌도끼님 답변 감사 드립니다. 제가 너무 초보라 잘 못알아 들어서 답답하시죠 ^^;;
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼