Cake -Experimental Switch Ошибка компиляции

Я пытаюсь использовать надстройку Cake-Plist и получаю сообщение об ошибке, которое динамическое еще не реализовано в используемой версии Roslyn. Затем из совета для кого-то мне посоветовали попробовать переключатель -Experimental. При использовании переключателя я получаю следующую ошибку при попытке скомпилировать сценарий сборки.

Error: Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (2,1): error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
    at Microsoft.CodeAnalysis.Scripting.Script.CompilationError(DiagnosticBag diagnostics)
    at Microsoft.CodeAnalysis.Scripting.Script.GetExecutor(CancellationToken cancellationToken)
    at Microsoft.CodeAnalysis.Scripting.Script.Run(Object globals)
    at Microsoft.CodeAnalysis.Scripting.Script.Run(Object globals)
    at Cake.Scripting.Roslyn.Nightly.DefaultRoslynNightlyScriptSession.Execute(Script script)
    at Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host, FilePath scriptPath, IDictionary`2 arguments)
    at Cake.Commands.BuildCommand.Execute(CakeOptions options)
    at Cake.CakeApplication.Run(CakeOptions options)
    at Cake.Program.Main()

Кто-нибудь знает, что вызывает эту ошибку?


person Todd Stewart    schedule 12.08.2016    source источник
comment
Похоже, вам нужно скомпилировать более позднюю версию фреймворка (которая включает этот метод)   -  person SLaks    schedule 12.08.2016
comment
Может быть, вам не хватает ссылки на Microsoft.CSharp.dll?   -  person svick    schedule 12.08.2016


Ответы (3)


Необходимо добавить ссылку на Microsoft.CSharp.dll.

#reference "Microsoft.CSharp.dll"

https://gitter.im/cake-build/cake?at=57add5a3364ad7fc5acdb660

person Todd Stewart    schedule 12.08.2016

У меня была аналогичная проблема при запуске на Mac (OSX El Capitan).

Я не мог найти Microsoft.CSharp.dll нигде на Mac (кроме моей установки MS Windows) и не хотел добавлять его в качестве зависимости в один из моих проектов только для того, чтобы заставить его построить вот так на компьютере. Mac.

Однако я заметил, что Mono.CSharp.dll загружается в папку ./tools/Cake. Это служит примерно той же цели, поэтому я попытался сослаться на это с помощью

#r "Mono.CSharp.dll"

Это тоже не сработало. Но когда я изменил его на

#r "./tools/Cake/Mono.CSharp.dll"

Это сработало отлично.

Теперь все, что мне нужно сделать, это определить, на какой платформе он работает, и использовать правильный

#r "xxx.CSharp.dll"...

person wislon    schedule 04.01.2017
comment
Решили ли вы ссылаться на разные сборки на разных платформах? Я в той же точке. - person Justin Caldicott; 22.07.2017
comment
тьфу нет, я отвлекся и больше никогда не возвращался к этому. простите :( - person wislon; 24.07.2017
comment
Хорошо, спасибо @wilson. У меня есть решение, которое сработало для меня, и я написал его как ответ: stackoverflow.com/a/45260186/1386540 - person Justin Caldicott; 24.07.2017

Вы можете использовать отражение вместо динамического. Немного менее элегантно, но позволяет избежать проблем со ссылками на Microsoft.CSharp.dll и Mono.CSharp.dll.

Пример будет записан следующим образом.

#addin "Cake.Plist"

Task("update-ios-version")
    .Does(() =>
    {
        var plist = File("./src/Demo/Info.plist");
        var data = DeserializePlist(plist);

        var itemPropertyInfo = data.GetType().GetProperty("Item");
        itemPropertyInfo.SetValue(data, gitVersion.AssemblySemVer, new[] { "CFBundleShortVersionString" });
        itemPropertyInfo.SetValue(data, gitVersion.FullSemVer, new[] { "CFBundleVersion" });

        SerializePlist(plist, data);
    });
person Justin Caldicott    schedule 22.07.2017
comment
Спасибо, это помогло мне решить мою проблему. var plist = File(project.Path.GetDirectory() + "/info.plist"); var data = (Dictionary<string, object>) DeserializePlist(plist); var bundleId = data["CFBundleIdentifier"].ToString(); - person Chris Forbes; 23.08.2017