2014-03-12 11 views
4

.winmd 파일을 보면, 실제 구현은 어디에서 찾을 수 있습니까? .winmd 파일은 헤드 파일이나 동적 라이브러리의 .lib 파일과 마찬가지로 구현이 포함되어 있지 않으므로 구현이 어디인지 궁금합니다. 감사합니다. ..winmd 파일이 주어지면 실제 구현 DLL은 어디에서 찾을 수 있습니까?

+0

왜 질문에 대한 답변을 알고 싶습니까? 유휴 호기심입니까 아니면 답을 기술적으로 필요로합니까? –

답변

3

수 없습니다. .winmd 파일에는 형식 선언이 포함되어 있으며 코드가 없습니다. COM 자동화에서 사용되는 형식 라이브러리 (.tlb)와 정확히 동일합니다. C 또는 C++ 프로그램에서 .h 파일과 논리적으로 동일합니다.

.tlb 형식이 WinRT를 지원하기에 너무 제한적이어서 .winmd로 다시 설계 되었기 때문에 파일 형식이 .NET 메타 데이터와 동일하므로 .NET 도구 (예 : ildasm.exe)를 사용하여 함유량. 컴파일러는 C++ 컴파일러가 클래스 선언을 포함하는 .h 파일을 포함하여 클래스 라이브러리를 사용하는 방법을 알고있는 것처럼 WinRT 구성 요소를 사용하는 적절한 코드를 생성하는 방법을 알기 위해이를 사용합니다.

마찬가지로 .h 파일과 마찬가지로 유형을 구현하는 실행 파일을 파악하고 사용자 컴퓨터에 배포해야합니다. 모든 WinRT 형식을 선언하는 Windows.winmd가 아닌 한 이진 구성 요소가 .winmd 파일과 매우 비슷할 것으로 예상됩니다. Store에서는 바이너리 구성 요소를 패키지에 포함시켜야합니다. 도움이 필요할 경우 구성 원에게 도움을 요청하십시오.

+0

감사합니다. 한스. 그러나 로더가 실제 구현 코드가 어디에 있는지 어떻게 알 수 있습니까? 기본 세계로 돌아 가면 .lib은 "jmp _imp_xxx"와 같은 명령어 만 포함하고 loader는 .DLL을로드하고 제어 주소가 .winmd와 매우 유사한 실제 코드로 점프 할 수 있도록 기본 주소를 변경합니다. 내 코드가 .winmd, loader 또는 OS의 일부 구성 요소에있는 함수를 호출하면 제어 흐름을 실제 코드로 리디렉션해야합니다. 맞습니까? 그들은 어떻게 실제 집합체를 찾았습니까? – codewarrior

+0

큰 질문입니다. reg-free COM이 작동하는 방식과 매우 비슷합니다. 바인딩은 런타임에 동적으로 발생하며 로더는 관련되지 않습니다. RoCreateInstance()는 팩토리 함수이며 레지스트리에 해당하는 것은 패키지 매니페스트입니다. –

1

한스가 꽤 많이 있습니다. winmd 파일은 형식의 모양을 설명합니다 (런타임시 CLR 및 JS 언어 투영 및 컴파일 타임에 C++ 컴파일러에 사용됨). 런타임에 RoActivateInstance API (또는 RoGetActivationFactory API)는 유형 이름을 가져 와서 해당 유형을 구현하는 객체를 반환합니다.

패키지 특정 유형의 경우 패키지 매니페스트의 ActivatableClassId 항목은 런타임 클래스 구현의 위치를 ​​설명합니다. 시스템 특정 유형의 경우 레지스트리에 있지만 유형의 위치는 나중에 언제든지 변경 될 수 있습니다.

5

면책 조항 :이 답변은 사전 통보없이 언제든지 변경 될 수 있습니다 문서화되지 않은 구현 세부 사항을 설명합니다.

Windows.winmd 또는 .winmd에 정의 된 유형이 C:\windows\system32\WinMetadata 인 경우 레지스트리에서 실제 구현을 표시합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId\SystemSettings.DataModel.SettingsDatabase에서 유형 이름을 찾고 DllPath 값은 유형을 구현하는 DLL을 포함합니다.

+0

이 답변에는 문서화되지 않은 구현 세부 사항 (사전 통지없이 언제든지 변경 될 수 있음)을 설명하는 공식 문서 또는 면책 조항에 대한 링크가 필요합니다. – IInspectable

+0

죄송합니다. 면책 조항이 없으면이 답변은 위험합니다.-1, 나는 특히 ** 지원되는 ** API가 나와서, 거의 반 년 전에 [대답] (http://stackoverflow.com/a/22369178/1889329)에 게시 된 것을 두려워합니다. 문서화되지 않은 인터페이스를 사용하여 응용 프로그램을 수정해야하는 회사에서 일한다고 주장한 이래로 부끄러운 일입니다. – IInspectable

+0

내 대답은 이전 대답을 보완합니다. 면책 조항을 추가하는 것이 의미가 있습니다. 감사합니다! – kiewic