2015-06-22 15 views
8

Podstawowe pytanie/podsumowanie: Muszę odwołać się do pliku binarnego (dll) utworzonego przez kogoś innego w C z uniwersalnego projektu aplikacji Win 10. Istnieje jednak osobna biblioteka dll dla x86 i ramienia. Sądzę, że muszę odwołać się do pliku dll (lub przynajmniej pliku winmd) z projektu, aby mógł on zostać wdrożony, ale mogę odwoływać się tylko do jednego pliku, a nie do obu. Oznacza to, że aplikacja nie działa na jednej lub drugiej platformie (na pulpicie lub na telefonie), ponieważ zawiera nieprawidłowy plik binarny. Szukam rozwiązania.Odwoływanie bibliotek DLL z systemu Windows 10 Uniwersalna aplikacja w architekturach procesorów

Bardziej szczegółowe wyjaśnienie;

Próbuję napisać uniwersalną aplikację Windows (nowy styl Windows 10). Oznacza to, że mam pojedynczy projekt, do którego można dodać odniesienia do zewnętrznych komponentów.

Potrzebuję niektórych elementów przetwarzania obrazu, które najlepiej kupić jako komponent innej firmy niż opracowane w domu. Istnieje kilka SDK dostępnych od stron trzecich, które obsługują WinRT, ale żaden nie obsługuje specjalnie UWA. Wszystkie pakiety WinRT SDK mają jednak różne pliki binarne dla aplikacji Windows Phone i Windows Desktop. a pliki binarne są tworzone ze źródła C/C++. To było w porządku ze starszymi "uniwersalnymi" aplikacjami, ponieważ istniał osobny projekt dla telefonu i komputera, więc można było odwoływać się do różnych komponentów w każdym projekcie, ale teraz jest tylko jeden projekt, do którego można dodać odniesienia.

Zapytałem jednego dostawcę o wsparcie dla UWA i twierdzili, że jest to niemożliwe, nie mogli utworzyć pojedynczego pliku binarnego, aby kierować obie platformy (ramię vs x86) i nie znali sposobu, w jaki mój UWA mógłby odnieść się do właściwych plik, gdy aplikacja jest zbudowana dla odpowiedniej architektury (co, jak zakładam, powinno się wydarzyć).

Zakładam istnieje jakiś sposób (być może w winmd pliku?) Powiedzieć: „Hej, oto dwie kopie tej samej biblioteki dll dla różnych architektur procesora, wybrać ten, jesteś budynku za” i tak długo, jak publiczny interfejs API pasuje do aplikacji po prostu używa właściwego?

Czy istnieje rozwiązanie tego problemu? Czy ktoś wie, jak ten rodzaj odniesienia ma działać? Czy mam po prostu pecha?

Dzięki.

+0

Wygląda na to, że dostawca komponentów może utworzyć składnik WinRT, który robi to, co trzeba; http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2014/05/30/windows-phone-8-1-more-universal-winrt-components.aspx - smutne, że w moim przypadku nie. – Yort

+0

Może być również możliwe samodzielne pakowanie plików sdk innych firm jako rozszerzenie WinRT (co byłoby podobne do edycji pliku csproj, ale bardziej nadaje się do wielokrotnego użytku w różnych projektach); https: // msdn.microsoft.com/en-us/library/jj127117.aspx – Yort

Odpowiedz

7

Istnieje sposób na odniesienie tej samej biblioteki DLL z różnymi architekturami w projekcie, ale nie można tego zrobić bezpośrednio z VS. Będziesz musiał ręcznie edytować plik csproj.

W twoim pliku csproj, będziesz musiał pójść na dół i zlokalizować sekcje. Te sekcje odnoszą się do wszystkich twoich plików.

W definicji projektu znajduje się specjalny znacznik, który pozwala polecić programowi Visual Studio wykonanie określonych działań na podstawie określonych warunków. Następnie możesz utworzyć grupę, która będzie odwoływać się do twoich zależności DLL. Plik csproj będzie wtedy jak następuje: (I zostały usunięte wszystkie non-relevants rzeczy)

<Project> 
    <PropertyGroup /> 
    <PropertyGroup /> 
    <PropertyGroup /> 
    <ItemGroup /> 
    <ItemGroup /> 
    <Choose> 
    <When Condition=" '$(Platform)' == 'x86' "> 
     <ItemGroup> 
     <Content Include="..\Binaries\x86\MyLib1.winmd"> 
      <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
     </Content> 
     <Content Include="..\Binaries\x86\MyLib2.winmd"> 
      <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
     </Content> 
     </ItemGroup> 
    </When> 
    <When Condition=" '$(Platform)' == 'ARM' "> 
     <ItemGroup> 
     <Content Include="..\Binaries\ARM\MyLib1.winmd"> 
      <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
     </Content> 
     <Content Include="..\Binaries\ARM\MyLib2.winmd"> 
      <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
     </Content> 
     </ItemGroup> 
    </When> 
    </Choose> 
    <Import /> 
    <Import /> 
</Project> 

Używałem go na VS2013 dla niektórych projektów Windows Phone (aby działały zarówno na telefon i emulator). Nie testowałem na Windows 10 i VS2015, ale powinno działać w ten sam sposób.

+0

Dzięki, to jest przydatne. Spróbuję i zobaczę, jak to działa dla mnie. Wydaje mi się, że mam również dodatkowy problem, odwołujący się do prawidłowych plików runt w uniwersalnej aplikacji Win10, więc może mi to zająć trochę czasu, aby sprawdzić, czy to rozwiąże mój problem. – Yort