Ответ 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, унаследованное место для ссылочных сборок.