2015-06-22 6 views
8

Grundlegende Frage/Zusammenfassung: Ich muss auf eine Binärdatei (DLL) verweisen, die von jemand anderem in C aus einem universellen Win 10-Projekt erstellt wurde. Allerdings gibt es eine separate DLL für x86 und Arm. Ich glaube, ich muss auf die DLL (oder zumindest Winmd-Datei) aus dem Projekt verweisen, um es zu implementieren, aber ich kann nur eine Datei nicht beide verweisen. Das bedeutet, dass die App auf der einen oder anderen Plattform (Desktop oder Telefon) fehlschlägt, da die falsche Binärdatei enthalten ist. Auf der Suche nach einer Lösung.Verweise auf C Dlls von Windows 10 Universal App über CPU-Architekturen

Ausführlichere Erklärung;

Ich versuche, eine universelle Windows-Anwendung (neue Windows 10-Stil) zu schreiben. Das bedeutet, dass ich ein einzelnes Projekt habe, um Referenzen auf externe Komponenten hinzuzufügen.

Ich habe die Notwendigkeit für einige Bildverarbeitung Sachen, die am besten als 3rd-Party-Komponente gekauft wird, anstatt im Haus entwickelt. Es gibt mehrere SDKs von Drittanbietern, die WinRT unterstützen, aber keine, die speziell UWA unterstützen. Die WinRT SDKs haben jedoch alle unterschiedliche Binärdateien für Windows Phone und Windows Desktop Apps. und die Binärdateien werden alle aus C/C++ - Quellen erstellt. Dies war in Ordnung mit den älteren "universellen" Apps, da es ein separates Projekt für Telefon und Desktop gab, so dass Sie einfach auf verschiedene Komponenten in jedem Projekt verweisen konnten, aber jetzt gibt es nur ein Projekt, um Referenzen hinzuzufügen.

Ich fragte einen Anbieter nach UWA-Unterstützung und sie behaupteten, es sei unmöglich, sie könnten keine einzige Binärdatei erstellen, um beide Plattformen (Arm vs. x86) zu tarnen, und sie wussten nicht, wie meine UWA die Rechte referenzieren könnte Datei, wenn die App für die entsprechende Architektur gebaut wird (was ich vermute, sollte passieren).

I annehmen, dass es irgendwie (vielleicht in einer winmd-Datei?) Zu sagen: ‚Hey, hier ist zwei Kopien derselben DLL für verschiedene CPU-Architekturen, wählen, die Sie für Gebäude sind‘ und so lange Die öffentliche API stimmt mit der App überein, verwendet nur die richtige?

Gibt es dafür eine Lösung? Weiß jemand, wie diese Art von Referenz funktionieren soll? Oder bin ich nur Pech?

Danke.

+0

Es scheint, dass der Komponentenanbieter eine WinRT-Komponente erstellen kann, die das Richtige tut; http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2014/05/30/windows-phone-8-1-more-universal-winrt-components.aspx - traurig, dass in meinem Fall nicht. – Yort

+0

Es ist auch möglich, dass ich die SDK-Dateien von Drittanbietern als WinRT-Erweiterung selbst verpacke (was ähnlich wäre wie die Bearbeitung der csproj-Datei, aber wiederverwendbar über Projekte hinweg); https: // msdn.microsoft.com/en-us/library/jj127117.aspx – Yort

Antwort

7

Es gibt eine Möglichkeit, dieselbe DLL mit verschiedenen Architekturen in einem Projekt zu referenzieren, aber Sie können es nicht direkt von VS aus tun. Sie müssen die csproj-Datei manuell bearbeiten.

In Ihrer csproj-Datei müssen Sie nach unten gehen und die Abschnitte suchen. Diese Abschnitte verweisen auf alle Ihre Dateien.

In der Projektdefinition gibt es ein spezielles Tag, mit dem Sie Visual Studio anweisen können, bestimmte Aktionen basierend auf bestimmten Bedingungen auszuführen. Sie können dann eine Gruppe erstellen, die auf Ihre DLL-Abhängigkeiten verweist. Ihre csproj Datei wird dann wie folgt vor: (Ich habe alle Nicht-relevants Dinge entfernt)

<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> 

ich es auf VS2013 für einige Windows-Phone-Projekte verwendet haben (um sie auf die beiden zu machen arbeiten Telefon und der Emulator). Ich habe nicht auf Windows 10 und VS2015 getestet, aber es sollte genauso funktionieren.

+0

Danke, das ist nützlich. Ich werde es versuchen und sehen, wie es für mich funktioniert. Ich denke, dass ich auch ein sekundäres Problem habe, das auf die korrekten c-Laufzeiten in der Win10 Universal-App verweist, also könnte es eine Weile dauern, um zu sehen, ob dies mein Problem löst. – Yort

Verwandte Themen