Ссылка на библиотеку для платформы из неспецифического приложения .NET - PullRequest
4 голосов
/ 28 февраля 2009

Мне часто нужно включать небольшие кусочки нативного кода в мои приложения на C #, что я обычно делаю с помощью C ++ / CLI. Обычно мне просто нужно использовать библиотеку C ++, для которой нет хорошей альтернативы .NET; но иногда производительность тоже является фактором.

Это проблематично; это означает добавление ссылки на конкретную библиотеку x86 или x64. Большинство библиотек поддерживают как 64-битную, так и 32-битную компиляцию или требуют лишь незначительных изменений для работы под 64-битной. Однако я могу ссылаться только на одну версий из конкретной цели сборки проекта C #. Это означает, что мне нужно вручную добавить несколько целей сборки для каждого проекта в решении.

VS.NET в этом случае крайне бесполезен: если вы добавляете библиотеку C ++ и библиотеку C # к одному решению, а библиотеки C # и C ++ имеют как 32, так и 64-битные цели, ваше решение будет содержать «Любой ЦП». target, цель «Mixed Platforms», цель x64, цель x86 (что C # называет 32-разрядной), цель win32 (то, что C ++ называет 32-разрядной) и, возможно, больше; как минимум в двух версиях (будь то Release и Debug, если вы не добавили больше).

Это быстро и беспричинно. Очевидное поведение не должно быть таким хитрым: если у меня есть проект C #, ссылающийся на проект C ++, то должно быть несколько очевидно, что 64-разрядная версия должна ссылаться на 64-разрядную версию и аналогично для 32-разрядной.

Худшая часть всего этого состоит в том, что все это приводит к двум отдельным, но идентичным исполняемым файлам: Любой CPU-проект .NET может работать без изменений в 32- и 64-битном режимах, но я не нашел способа загрузить соответствующий библиотеки поддержки для конкретной платформы в зависимости от режима, в котором было запущено приложение.

Подводя итог этой длинной прогулки:

  • Можно ли сделать работу с VS над кроссплатформенными приложениями менее трудной - заставить ее добавлять соответствующие ссылки на соответствующие цели сборки без ручного захвата?
  • Существует ли простой способ сделать исполняемый файл .NET со ссылками на платформу, который может работать как в 32-разрядном, так и в 64-разрядном режиме, при необходимости загружая соответствующие сборки?

Ответы [ 2 ]

0 голосов
/ 01 марта 2009

Главный вопрос, который вы должны задать себе: нужна ли вам 64-битная версия. Подробнее см. В блогах Скотт Хансельман и себя .

Если вам действительно нужны обе версии, вы также можете загрузить как 32-битную, так и 64-битную библиотеку в GAC, чтобы среда выполнения могла автоматически выбрать правильную.

Если вы не хотите GAC для своих библиотек, вы также можете взглянуть на этот пост StackOverflow , где описан способ загрузки правильной сборки. Мне не очень нравится это решение, потому что оно действительно требует модели плагина

0 голосов
/ 28 февраля 2009

Мой ответ ДА. Возможный подход - использовать архитектуру надстройки, чтобы она работала так:

  1. Когда ваше приложение C # работает на x86, оно загружает версию аддина x86.
  2. Когда он работает на x64, он загружает версию x64.

Затем вы готовите два проекта для версий надстройки. Один настроен на компиляцию для x86, а другой для x64. В свою очередь, надстройка x86 выполняет обертку над сборкой x86 библиотеки C ++ и сборкой x64 over x64 библиотеки C ++.

Это немного сложно, потому что вам нужно поддерживать два файла проекта надстройки, в то время как исходные файлы могут быть общими.

Используя архитектуру надстроек, библиотеки надстроек загружаются во время выполнения, поэтому у вас есть достаточно времени, чтобы определить, сейчас ли он установлен на x86 или x64, а затем решить, какой надстройку загрузить.

Надеюсь, эта помощь.

...