2015-06-22 2 views
8

Основной вопрос/резюме: Мне нужно ссылаться на двоичную (dll), созданную кем-то еще на C из проекта универсального приложения Win 10. Однако есть отдельная dll для x86 и arm. Я считаю, что мне нужно ссылаться на dll (или, по крайней мере, на winmd-файл) из проекта, для его развертывания, но я могу ссылаться только на один файл, не оба. Это означает, что приложение терпит неудачу на той или иной платформе (на рабочем столе или на телефоне), потому что в нее включена неправильная двоичная информация. Ищете решение.Ссылка на C Dll из Windows 10 Универсальное приложение на архитектуре ЦП

Более подробное объяснение;

Я пытаюсь написать универсальное приложение Windows (новый стиль Windows 10). Это означает, что у меня есть один проект, чтобы добавить ссылки на внешние компоненты.

У меня есть потребность в некоторых продуктах обработки изображений, которые лучше всего покупаются как сторонний компонент, а не разрабатываются в доме. Существует несколько SDK от сторонних сторон, которые поддерживают WinRT, но ни один из них не поддерживает UWA. Однако у WinRT SDK есть разные бинарные файлы для Windows Phone и Windows Desktop. и двоичные файлы созданы из источника C/C++. Это было прекрасно с более старыми «универсальными» приложениями, потому что был отдельный проект для телефона и рабочего стола, поэтому вы могли просто ссылаться на разные компоненты в каждом проекте, но теперь есть только один проект, чтобы добавить ссылки.

Я спросил одного поставщика о поддержке UWA, и они заявили, что это невозможно, они не могут создать единый бинарный файл для обеих платформ (arm vs x86), и они не знали, как мой UWA может ссылаться на право файл, когда приложение построено для соответствующей архитектуры (это то, что я предполагаю, должно произойти).

Я предположить есть некоторым образом (возможно, в winmd файле?), Чтобы сказать: «Эй, вот две копии одного и того же DLL для различных архитектур процессоров, выбрать тот, вы строите для» и так долго, как публичный API соответствует приложению, просто использует правильный?

Есть ли решение для этого? Кто-нибудь знает, как эта работа должна работать? Или мне просто не повезло?

Спасибо.

+0

Возможно, поставщик компонентов может создать компонент WinRT, который делает правильную вещь; http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2014/05/30/windows-phone-8-1-more-universal-winrt-components.aspx - грустно, что в моем случае они этого не сделали. – Yort

+0

Возможно также, что я могу самостоятельно упаковать файлы сторонних sdk в качестве расширения WinRT (что было бы похоже на редактирование файла csproj, но более многоразового использования в проектах); https: // MSDN.microsoft.com/en-us/library/jj127117.aspx – Yort

ответ

7

Существует способ ссылки на одну и ту же DLL с различными архитектурами в проекте, но вы не можете делать это напрямую из VS. Вам придется вручную отредактировать файл csproj.

В вашем файле csproj вам нужно будет перейти к нижней части и найти разделы. Эти разделы ссылаются на все ваши файлы.

В определении проекта есть специальный тег, который позволяет вам рассказать Visual Studio о выполнении определенных действий на основе некоторых условий. Затем вы можете создать группу, которая будет ссылаться на ваши зависимости DLL. Ваш файл csproj тогда будет как следующее: (я удалил все не relevants вещи)

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

Я использовал его на VS2013 для некоторых телефонов проектов для Windows (чтобы заставить их работать как на телефона и эмулятора). Я не тестировал в Windows 10 и VS2015, но он должен работать одинаково.

+0

Спасибо, это полезно. Я попробую и посмотрю, как это работает для меня. Я думаю, что у меня также есть вторичная проблема, связанная с правильными сроками c в универсальном приложении Win10, поэтому мне может потребоваться некоторое время, чтобы понять, разрешает ли это моя проблема. – Yort