2017-02-15 5 views
3

Недавно мы обновили старый код CodeDomProvider до нового Roslyn CodeDomProvider под названием Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Он отлично работает, но ищет csc.exe не в том месте. Пакет NuGet помещает ех в пути:CodeDomProvider.CompileAssemblyFromSource - не удается найти Roslyn (csc.exe)

[App Path] \ Bin \ Debug \ Рослины

Но, когда мы собираем, мы получаем эту ошибку: Не удалось найти часть пути ' [Путь приложения] \ bin \ Debug \ bin \ roslyn \ csc.exe '.

Обратите внимание, что он ищет EXE в неправильном месте. Он ищет его внутри папки «bin», которая уже находится в папке bin \ Debug. Итак, чтобы скомпилировать наш код, нам нужно переместить компилятор Roslyn на: [Путь к файлу] \ bin \ Debug \ bin \ roslyn \ csc.exe

Есть ли способ сообщить CodeDomProvider, где Компилятор Roslyn находится? Разве это не просто ошибка в коде компилятора Roslyn?

ответ

1

Я бы рассмотрел пакет NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix. Я не использовал его, но он имеет 10K загрузок, потому что это проблема, с которой многие сталкиваются, я думаю. Я столкнулся с этой проблемой, и я помню, с помощью отражения, чтобы обойти его, вот фрагмент кода я написал со ссылкой на ответ переполнения стека я основывая его на, где _compiler является моим CSharpCodeProvider:

// Little hack here, see http://stackoverflow.com/a/40311406/1676558. 
object compilerSettings = typeof(CSharpCodeProvider) 
    .GetField("_compilerSettings", BindingFlags.Instance | BindingFlags.NonPublic) 
    .GetValue(_compiler); 
FieldInfo compilerSettingsFullPathField = compilerSettings 
    .GetType() 
    .GetField("_compilerFullPath", BindingFlags.Instance | BindingFlags.NonPublic); 
string desiredCompilerSettingsFullPath = ((string)compilerSettingsFullPathField 
    .GetValue(compilerSettings)) 
    .Replace(@"bin\roslyn\", @"roslyn\"); 
compilerSettingsFullPathField.SetValue(compilerSettings, desiredCompilerSettingsFullPath); 
+0

Ах да. Это взломанно, но похоже, что это может решить проблему. –

0

Изменить "сообщения -Build командной строки события «в» вкладки события построения 'ваших настроек проекта в:

IF EXIST $(TargetDir)roslyn\csc.exe (MKDIR $(TargetDir)bin & MOVE /Y $(TargetDir)roslyn $(TargetDir)bin\roslyn) 
+0

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

Смежные вопросы