Почему мы можем изменить платформу в настройках проекта .NET, если она не зависит от платформы? - PullRequest
4 голосов
/ 31 января 2012

Я работаю с Visual Studio 2010, .NET 4.0 и WPF. Мы пытаемся построить проект с платформой «AnyCPU», которая сделает программную платформу нейтральной. В середине этого я запутался.

Я думал, что все программы .NET предназначены для .NET Framework вместо операционной системы. Если это так, я не должен беспокоиться о том, работаю ли я в системе "x64" или "x86". Все, что предназначено для этой программы - это .NET Framework, который является подходящим «Run Time», который позаботится о себе сам. CLR может распределять память в соответствии с платформой, на которой он находится, но проекты .NET не должны беспокоиться об этом.

Что мне здесь не хватает? В чем смысл «платформы» в настройках сборки в проектах .NET?

Ответы [ 3 ]

4 голосов
/ 31 января 2012

Как уже упоминали другие, когда вы используете другие библиотеки, созданные для конкретной платформы, вам может потребоваться указать эту платформу.Одним хорошим примером является COM.

Допустим, у вас есть 32-битный компонент COM (который больше всего), а клиентская ОС 32-битная.Если вы скомпилируете для AnyCPU, он будет работать нормально, потому что он будет JIT к собственному коду x86, поскольку вы работаете в 32-битной системе.

Теперь допустим, что у вас есть тот же компонент COM и клиентская ОСэто 64 битВ Windows, когда COM-компонент будет зарегистрирован, он будет зарегистрирован в 32-битном разделе реестра (WOW6432Node, я думаю).Поэтому, если ваше приложение скомпилировано для «AnyCPU», оно будет собственным 64-разрядным приложением и не сможет вызывать ваш COM-компонент (в результате класс не будет зарегистрирован), поскольку оно будет выглядеть в 64-разрядном реестре.Если вы скомпилируете для x64, вы получите ту же ошибку (поскольку после JIT это приведет к тому же самому нативному коду.) Но если вы скомпилируете для x86, все будет работать нормально.

4 голосов
/ 31 января 2012

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

Например, в один из моих проектов я включил libvorbis и мне было лень компилировать 64-битную версию. Поэтому я просто установил свой проект только на 32 бита. Некоторые другие собственные библиотеки могут вообще не поддерживать 64 бита, особенно если они являются устаревшими компонентами с закрытым исходным кодом.

1 голос
/ 31 января 2012

Как сказал CodeInChaos, это вопрос библиотеки. В x64 вы не можете использовать библиотеки x86. Под x86 вы можете запускать библиотеки x64.
Any cpu означает, что он будет использовать текущие настройки платформы (с процессором).

Если вы хотите прочитать более подробно об этом, вот хорошее чтение: http://visualstudiohacks.com/articles/...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...