Visual Studio 2010 С++/CLI в режиме статической библиотеки: не удалось найти сборку 'mscorlib.dll'

Я работаю над проектом С++/CLI с VS 2012 в динамической библиотеке (DLL) и в режиме x64.

Если я переключу режим в Статическую библиотеку, я получу ошибку ниже.

Ошибка 1 ошибка C1107: не удалось найти сборку "mscorlib.dll": укажите путь поиска сборки с помощью /AI или установив переменную среды LIBPATH C:\Depot\Main\Current\Sln\ALibraryProject\Stdafx.cpp 1 1 ALibraryProject

Я попытался удалить ссылку на файл mscorlib.dll, а затем снова добавить его:

Проект > Свойствa > Общие > Общие свойства

Но это не помогло. Поскольку я знаю, что VS обрабатывает ссылку на сборки .NET, я не хочу добавлять ссылку на файл диска, поскольку это кажется нелогичным! Кто-нибудь сталкивался с этим раньше?

Ответ 1

Если я переключу режим в Статическую библиотеку

Это не типичная ошибка, возникающая при попытке создать статическую библиотеку с /clr. Я должен был предположить, что вы возились с настройками проекта, чтобы избавиться от непостижимых ошибок компоновщика, которые вы получаете, когда пытаетесь это сделать.

Основной проблемой является то, что система сборки С++/CLI не поддерживает статические библиотеки, содержащие MSIL. Управляемый код не использует компоновщик, привязка происходит во время выполнения. В результате исчезает существенная разница между статическими библиотеками и DLL. Поэтому Microsoft решила не поддерживать его, потому что не имеет смысла его реализовывать. К сожалению, они не кричат ​​достаточно громко, когда вы пытаетесь сделать это в любом случае, ошибки компоновщика, которые вы получаете, не дают достаточного намека на то, что вы сделали неправильно. Обходные пути, такие как слияние с ILMerge, также не работают, он не может работать с сборками смешанного режима. Слияние собственных разделов кода и связанных с ними записей таблицы перемещений очень нетривиально.

Имейте в виду, что для ссылок на собственные статические библиотеки очень удобно. В типичном проекте С++/CLI есть только обертки класса ref, которые должны быть созданы с /clr. Вы можете приклеить любое количество нативного кода из библиотек в последнюю сборку.


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

Остерегайтесь того, что таргетинг на другую версию .NET, чем та, которая была установлена ​​на вашем компьютере, является довольно опасным делом, особенно если вы хотите настроить таргетинг 4.0, и у вас установлено 4.5.x. Ключевым элементом в файле .vcxproj является <TargetFrameworkVersion>. Это будет отсутствовать, если вы начали проект, ориентированный на старую версию .NET, вы должны вставить его самостоятельно. IDE также не поддерживает изменение его, если он присутствует, снова редактируя вручную.

Этого достаточно, чтобы убедить MSBuild в создании правильной команды компиляции. Вы можете проверить, хорошо ли это продумано, посмотрите в подкаталог *.tlog каталога сборки Debug для вашего проекта. Файл cl.command.1.tlog показывает параметры, которые были переданы компилятору. Он должен содержать:

/AI "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0"
/FU "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll"

Обратите внимание на подкаталог, очень важно, чтобы он соответствовал вашей целевой цели .NET. v4.0 в этом примере. И очень, очень важно, чтобы он не указывал на c:\windows\microsoft.net, унаследованное место для ссылочных сборок.

Ответ 2

У меня была та же проблема при преобразовании моего решения из компилятора VS2010 в компилятор VS2013.

Я решил это, изменив параметры проекта (для проекта, содержащего файл .cpp, который выбрал эту ошибку) следующим образом: В настройках проекта | C/С++ | Общий | Дополнительные каталоги #using Я добавил макрос $(FrameworkPathOverride). Это разрешает каталог справочной сборки для версии .NET, на которую вы нацеливаетесь, что в моем случае - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.1

Ответ 3

У меня та же проблема. Поскольку dll не работает, так как мне нужно предоставить собственную С++-оболочку для объекта .net, чтобы он мог выполнять интерфейс natice С++ - я не могу использовать .net в интерфейсе dll - это дает ошибку компиляции

Это работало как статическая библиотека в VS 2010 (с .net 4)

Некоторые из моих исполняемых файлов и dll, которые также имеют код с /clr. У них нет проблемы. Я не пытаюсь создать сеть Lbirary.

Ответ 4

Я решил это, удалив зависимость в старой и не обновленной смешанной библиотеке, которая также была настроена только в конфигурации Debug, и в результате она начала получать ту же ошибку, что и ваша, после того, как я изменил код.

Не удалось найти его, потому что ошибка не ясна, и зависимость была настроена с помощью "Дополнительные зависимости" в настройках проекта.