Подтвердить что ты не робот

Предупреждение компилятора CS1607 при создании версии x64

когда я создаю x64-версию моего .net-приложения с Visual Stuido 2008 на Windows Server 2003 я получаю

предупреждение CS1607: сборка сборки - ссылочная сборка "mscorlib.dll" нацелена на другой процессор

Означает ли это, что я не установил x64 версию .NET?

Полный отчет здесь

16 > C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig/nowarn: 17011702 /platform: x64/errorreport: prompt /Определить: DEBUG, TRACE /reference:..........\BIN\Jfc.Dealing\Jfc.Configuration.ConfigurationLayer.dll /reference:..........\BIN\Jfc.Dealing\Jfc.Sys.dll /reference:D:\Projects\dzhukov\SourceCode_Integration_branch\TradeProcessor\Jfc\QuikExport\bin\x64\Debug\QuikExport.dll /reference:D:\Projects\dzhukov\SourceCode_Integration_branch\Samples\JFC\FxGate\QuoteFeedWcfRemoteControl\bin\x64\Debug\QuoteFeedWcfRemoteControl.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /reference: "c:\Program Files\Reference Сборки \Microsoft\Framework\v3.5\System.Core.dll" /reference: "c:\Program Files\Reference Ассембли \Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll /reference: "C:\Program Files\Reference Сборки \Microsoft\Framework\v3.0\System.Runtime.Serialization.dll" /reference: "C:\Program Files\Reference Сборки \Microsoft\Framework\v3.0\System.ServiceModel.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference: "c:\Program Files\Reference Сборки \Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug +/debug: full/filealign: 512 /out:obj\x64\Debug\FeedRawQuotes.exe /target: exe FeedRawQuotes.cs FeedRawQuotesConfiguration.cs MSMQFeed.cs Program.cs Свойства\Предупреждение AssemblyInfo.cs CS1607: сборка - Ссылочная сборка 'System.Data.dll' нацеливает другое предупреждение процессора CS1607: сборка - Ссылка на сборку 'mscorlib.dll' нацеливается на другой процессор

4b9b3361

Ответ 1

Это нормальное предупреждение, вы всегда получите его, когда вы явно нацелитесь на x64. Это не будет проблемой во время выполнения, потому что на 64-битной машине GAC хранит 64-разрядную версию mscorlib.dll.

Длинная версия: несколько сборок .NET содержат неуправляемый код. Это делает их чувствительными к битту процесса, который их использует. Mscorlib.dll - один из них, System.Data.dll и сборки WPF - другие примеры. Microsoft решила это, построив две версии этих сборок, 32-разрядную и 64-битную. GAC может хранить их оба, разрешенные свойством AssemblyName.ProcessorArchitecture. "Обычный" параметр для этого свойства - MSIL, используемый, когда сборка содержит чистый IL. Одна копия сборки может быть использована как 32-разрядным, так и 64-битным процессом.

Ссылочные сборки, используемые компилятором, представляют собой копию сборников .NET. Компилятор использует их исключительно для своих метаданных. Эти копии, однако, являются копиями 32-битных сборок, они будут иметь ProcessArchitecture для X86 для сборок, содержащих неуправляемый код.

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

Возможно, примечательно, что это было решено в .NET 4.0. Он использует очень разные ссылочные сборки, которые хранятся в C:\Program Files (x86)\Reference Assemblies. В отличие от сборочных сборок v2, они сильно отличаются от копии в GAC. Все MSIL были удалены из них, они содержат только метаданные. И есть AnyCPU, поэтому больше никаких предупреждений. Инструмент, который использовался для их создания, интересен, к сожалению, Microsoft не делится им с нами.

Fwiw, явно нацеленный на x64, почти всегда не так. Это действительно имеет значение на сборке EXE, поскольку именно это определяет битту процесса. У сборника DLL нет выбора, подходящим для них является любой процессор, поэтому они могут работать в обоих направлениях. Редкое исключение состоит в том, что DLL имеет известную зависимость от неуправляемого компонента, как правило, COM-сервера. Такие компоненты обычно доступны только в виде 32-битных изображений, при попытке загрузить их в 64-разрядном режиме ( "Класс не зарегистрирован" ) вам сложно диагностировать сообщение об ошибке. Заставляя их нацеливаться на x86, вы получите еще один трудный диагностировать исключение, которое, возможно, немного легче для глаз, BadImageFormatException. Наличие зависимости от неуправляемого кода, доступного только в 64-битном коде, довольно редко, поэтому таргетинг на x64 не имеет особого смысла.