Мне часто нужно включать небольшие кусочки нативного кода в мои приложения на 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-разрядном режиме, при необходимости загружая соответствующие сборки?