none
Как присоединить к проекту собирающемуся под Any CPU библиотеку Microsoft.WindowsAPICodePack.DirectX.dll. RRS feed

  • Вопрос

  • Как присоединить к .Net проекту собирающемуся под Any CPU библиотеку Microsoft.WindowsAPICodePack.DirectX.dll. Под Any CPU нету версии. Есть исходник на github, скачав который понял, что можно пересобрать под Win32 и под Win64.Но как обеспечить использование нужной библиотеки в зависимости от разрядности ОС. Загрузку либы через Reflection не предлагать, способ медленный и нужно к тому же переписывать кучу кода.

    Вот ссылка на проект в github https://github.com/aybe/Windows-API-Code-Pack-1.1. Приложение распространяется через ClickOnce



    29 ноября 2016 г. 9:35

Ответы

  • Подключите обработчик AppDomain.CurrentDomain.AssemblyResolve и загружайте нужную версию сборки определив разрядность процесса. Еслу обе сборки имеют одинковое имя (что ожидаемо) то никаких проблем не будет. То же самое касается предзагрузки через отражения, это на деле очень быстро (делается один раз) и никакого переписывания кода не требуется. Отражения, кстати, вообще очень быстрые если ими не злоупотреблять.

    Что до сборок с обертками COM то их без всяких проблем можно делать AnyCPU используя COM интероп. Это, однако, значительно более трудоемко чем врапперы на C++/CLI которые содержат родной код и поэтому являются процессорозависимыми (как в данном случае).

    В свое время я сделал обертки для DX11, D2D, DirectWrite, DXGI, WIC и WMF, все они без проблем работают на любых процессорах (в том числе на почившей в бозе Windows RT с ARM).


    This posting is provided "AS IS" with no warranties, and confers no rights.

    29 ноября 2016 г. 23:35
    Модератор
  • Не понимаю какие могут быть "принципиальные соображения" не использовать мощный и удобный инструмент? Это как если бы механик имел бы "принципиальные соображения" которые не позволяют использовать молотки (может в детстве себе по пальцу звезданул?), а вместо этого стучал бы, ну например, ключами?

    Но вольному - воля, "подшаманивайте" если хотите.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    30 ноября 2016 г. 17:30
    Модератор

Все ответы

  • Под Any CPU нету версии.

    Это вполне логично, т.к. DirectX - библиотека компонентов COM (фактически, неуправляемых библиотек DLL). Любые управляемые обертки DirectX должны соответствовать разрядности неуправляемой библиотеки, иначе конечное приложение просто не сможет ее загрузить.

    Поясню. "Any CPU" означает, что приложение .net компилируется под разрядность текущей ОС, на которой приложение запущено. ОС x64 - приложение .net тоже будет 64-разрядным. А если при этом используемая обертка DirectX использовала неуправляемый компонент x86, загрузка такой обертки будет блокирована системой.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    29 ноября 2016 г. 19:56
  • Подключите обработчик AppDomain.CurrentDomain.AssemblyResolve и загружайте нужную версию сборки определив разрядность процесса. Еслу обе сборки имеют одинковое имя (что ожидаемо) то никаких проблем не будет. То же самое касается предзагрузки через отражения, это на деле очень быстро (делается один раз) и никакого переписывания кода не требуется. Отражения, кстати, вообще очень быстрые если ими не злоупотреблять.

    Что до сборок с обертками COM то их без всяких проблем можно делать AnyCPU используя COM интероп. Это, однако, значительно более трудоемко чем врапперы на C++/CLI которые содержат родной код и поэтому являются процессорозависимыми (как в данном случае).

    В свое время я сделал обертки для DX11, D2D, DirectWrite, DXGI, WIC и WMF, все они без проблем работают на любых процессорах (в том числе на почившей в бозе Windows RT с ARM).


    This posting is provided "AS IS" with no warranties, and confers no rights.

    29 ноября 2016 г. 23:35
    Модератор
  • К сожалению решение через reflection не подходит по принципиальным соображениям, может можно как нибудь подшаманить манифест в clickonce, чтобы он, определяя разрядность платформы предлагал к скачиванию нужную сборку.
    30 ноября 2016 г. 10:26
  • Не понимаю какие могут быть "принципиальные соображения" не использовать мощный и удобный инструмент? Это как если бы механик имел бы "принципиальные соображения" которые не позволяют использовать молотки (может в детстве себе по пальцу звезданул?), а вместо этого стучал бы, ну например, ключами?

    Но вольному - воля, "подшаманивайте" если хотите.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    30 ноября 2016 г. 17:30
    Модератор