none
안녕하세요. Store에 앱 배포 관련하여 질문있습니다. RRS feed

  • 질문

  • 안녕하세요. 앱 배포 시 참조하는 dll에 대해 문의를 드리고자 합니다.

    현재 스토어에 올릴 앱은 C# 프로젝트(UI 위주)로 구성되어 있고 그 안에 참조하는 dll은

    C++ 프로젝트로 구성되어져 있습니다.

    앱 스토어에 앱을 배포할 경우 C#프로젝트는 x86, x64, arm 플랫폼 별로 빌드가 되어져 배포할 수 있지만

    참조하는 c++인 경우 x86인지 x64인지 arm으로 컴파일된지 알 수가 없는데 이런 경우 처리할 수 있는 방법이 있는지 궁금합니다.

    즉, C#에서 x86으로 배포 시 참조하는 C++ 도 x86으로 컴파일된 dll을 참조할 수 있고, C#에서 x64는 C++ x64로,

    C#에서 arm으로 배포시 참조하는 C++도 arm버전으로 컴파일 된 dll을 참조할 수 있는 방법이 궁금합니다.

    2013년 10월 28일 월요일 오전 12:46

답변

  • 참조를 하실 때 컴포넌트 프로젝트들을 프로젝트 타입으로 참조하셨다면 어려움을 겪으실 리가 없다고 생각합니다.

    Solution Explorer에서 C# UI 프로젝트의 Reference에 Reference Manager를 이용하여 추가하려는 컴포넌트 프로젝트를 추가하고 (좌측 메뉴의 Solution 아래 Project를 선택하면 솔루션 내의 다른 프로젝트들을 선택 가능) 빌드하면 됩니다. 빌드했을 때 프로젝트 별로 플랫폼이 맞지 않는 경우 Configuration Manager를 통해서 맞춰주면 됩니다.

    만약 서드파티 컴포넌트를 사용하는 것처럼 DLL과 winmd만 따서 참조하시는 경우는 먼저 제가 드렸던 응답의 링크를 참고해서 시도해보시기 바랍니다. 이런 경우는 마땅한 방법이 떠오르지 않네요.

    그리고 스토어에 올리실 때는 플랫폼 별로 등록하는 게 아니고 하나의 앱을 등록할 때 패키지 업로드 하는 단계에서 일괄적으로 등록할 수 있으며, 다음과 같은 요구사항을 맞춰주시면 됩니다.

    -----

    http://msdn.microsoft.com/ko-KR/library/windows/apps/hh694075.aspx

    앱에 패키지가 여러 개 있는 경우 즉, 앱이 여러 프로세서 유형에서 실행되는 경우 각 패키지에서 다음 앱 매니페스트 요소가 동일해야 합니다.——

    • 답변으로 표시됨 Jina Lee 2013년 11월 4일 월요일 오전 2:39
    2013년 10월 31일 목요일 오후 4:00

모든 응답

  • C#으로 구현된 부분에서 C++로 개발한 모듈을 참조하시려는 것 같습니다. 이런 경우에 참조하는 WinRT 컴포넌트 DLL들을 C++을 이용하여 구현하는 것은 낭비가 아닌가 싶습니다 (물론 일부 C++을 써야만 개발이 쉽거나 가능한 부분이 있을 수는 있습니다만). Windows Store app을 개발 가능한 모든 언어는 WinRT 컴포넌트 DLL을 구현할 수 있으므로, 가능하시다면 컴포넌트들도 모두 managed code로 개발해보시는 것은 어떨까 합니다.

    그러면 질문으로 돌아와서 말씀하신 것과 같은 경우는 해당 C# UI 프로젝트를 Any CPU로 빌드를 할 수 없습니다. 컴포넌트 모듈이 특정 CPU 플랫폼을 타깃으로 만들어졌다면 그것을 참조하는 모듈 또한 특정 플랫폼을 지정하여 빌드되어야합니다. 이러한 연고로 만약 C#을 CPU 플랫폼에 무관하게 빌드하려고 하신다면, 위에서 말씀 드린 것처럼 참조하는 모듈 또한 managed code로 작성하셔야 하고, 이것이 불가능하다면 Any CPU 빌드를 포기하고 개발하셔야 합니다.

    2013년 10월 29일 화요일 오전 2:09
  • 그럼 혹시 참조하는 dll(.winmd)들을 코드레벨 단에서 참조할 수 있는 API가 혹시 존재하는지요?

    즉 visual studio에서 해당 dll(.winmd)경로를 찾아 넣어주는것이 아닌 동적으로

    코드레벨단에서 해당 dll(.winmd)을 참조할 수 있는 API가 있는지 궁금합니다.


    • 편집됨 JoMinTaek 2013년 10월 29일 화요일 오전 6:41
    2013년 10월 29일 화요일 오전 5:32
  • 그러한 방법은 존재하지 않습니다. 네이티브 컴포넌트를 참조하도록 만드셨다면 지원하는 플랫폼 별로 각각의 패키지를 만들어서 스토어에 등록하셔야 합니다. 데스크톱 앱에서는 각 DLL의 CLSID와 ProgID를 동일하게 하면 원하는 시나리오를 구현하실 수 있으나 스토어 앱은 그렇게 만들 수 없지요.

    2013년 10월 29일 화요일 오전 10:12
  • 이런... 지금 다시 보니 제가 좀 착각을 한게, 어차피 패키지는 각각 만드실 생각이 있으셨던 것 같은데 제가 동문서답을 한 꼴이 되었군요. :)

    같은 솔루션 안에 포함되는 프로젝트가 아니라면, 참조하는 DLL은 모두 solution explorer에 추가하시고 속성에서 Content를 true로 설정하시면 됩니다.

    아래 링크와 같은 내용이 도움이 되실 것 같습니다.

    http://blog.nuclex-games.com/2012/03/how-to-consume-dlls-in-a-winrt-metro-project/

    그런데 이러한 방법도 다 찾아서 적용하셨을 것 같네요.

    질문이 와닫지 않는데, 앱에서 뒷단의 DLL 타입을 확인해야 하는 이유가 있으신 건가요?

    2013년 10월 30일 수요일 오전 6:34
  • 앱에서 뒷단의 winmd 타입을 확인을 안할수가 없습니다.

    위에서 언급했듯이 C#프로젝트를 가령 arm 플랫폼으로 빌드했을 시 참조하는 C++ winmd가 arm이 아닌 x86으로

    컴파일되었기 때문에 아시다시피 빌드가 되지 않습니다.

    그래서 정말 하고싶은것은 C++ 프로젝트는 최소 x86, x64, arm 으로 컴파일하여 이 세개를

    C# 프로젝트에 전부 참조를 넣어두고 C#에서 arm으로 빌드 시 적어도 참조한 C++도 arm 버전을 참조하면

    에러가 발생하지 않겠다는 생각이 드는거죠.

    그래서 그 방법이 궁금한 것입니다.

    저뿐만 아니라 모든 사용자들이 참조를 사용하되 한가지 버전만 사용하리라 생각되진 않습니다.

    그렇다고 동일한 프로젝트 x86버전, x64버전, arm 버전을 따로 만들어 스토어에 각각 등록하는 것도 좀 그렇구요.

    방법이 없을거라 생각되진 않지만 찾기가 좀 힘이드네요..


    • 편집됨 JoMinTaek 2013년 10월 31일 목요일 오전 10:09
    2013년 10월 31일 목요일 오전 12:52
  • 참조를 하실 때 컴포넌트 프로젝트들을 프로젝트 타입으로 참조하셨다면 어려움을 겪으실 리가 없다고 생각합니다.

    Solution Explorer에서 C# UI 프로젝트의 Reference에 Reference Manager를 이용하여 추가하려는 컴포넌트 프로젝트를 추가하고 (좌측 메뉴의 Solution 아래 Project를 선택하면 솔루션 내의 다른 프로젝트들을 선택 가능) 빌드하면 됩니다. 빌드했을 때 프로젝트 별로 플랫폼이 맞지 않는 경우 Configuration Manager를 통해서 맞춰주면 됩니다.

    만약 서드파티 컴포넌트를 사용하는 것처럼 DLL과 winmd만 따서 참조하시는 경우는 먼저 제가 드렸던 응답의 링크를 참고해서 시도해보시기 바랍니다. 이런 경우는 마땅한 방법이 떠오르지 않네요.

    그리고 스토어에 올리실 때는 플랫폼 별로 등록하는 게 아니고 하나의 앱을 등록할 때 패키지 업로드 하는 단계에서 일괄적으로 등록할 수 있으며, 다음과 같은 요구사항을 맞춰주시면 됩니다.

    -----

    http://msdn.microsoft.com/ko-KR/library/windows/apps/hh694075.aspx

    앱에 패키지가 여러 개 있는 경우 즉, 앱이 여러 프로세서 유형에서 실행되는 경우 각 패키지에서 다음 앱 매니페스트 요소가 동일해야 합니다.——

    • 답변으로 표시됨 Jina Lee 2013년 11월 4일 월요일 오전 2:39
    2013년 10월 31일 목요일 오후 4:00