Дубликаты ссылок mscorlib в Roslyn при компиляции

194
16 января 2019, 03:40

Путь к .dll файлам брал от сюда:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\

List<string> DLL = new List<string>(); //тут уже лежит список путей к .dll
using (var provider = new CSharpCodeProvider())
{
   // DLL.ToArray() добавляю ссылки 
   var Params = new CompilerParameters() 
   {
     //parametrs build
   };
   provider.CompileAssemblyFromSource(Params, SourceCode) // compile
}

Но во время компиляции получаю ошибку:

error CS1703: Multiple assemblies with equivalent identity have been imported: 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll' and 'C:\Program Files (x86)\Reference\Assemblies\Microsoft\Framework.NETFramework\v3.5\Profile\Client\mscorlib.dll'.

Remove one of the duplicate references.

Как исправить?

[Дополнительная информация]

Сам проект скомпилирован под .Net4.5

(специально для Roslyn, под другие версии NetFramework его библиотеки он не ставит)

Если брать такой код:

List<string> DLL = new List<string>() // просто файлы
{
   "mscorlib.dll", "System.Data.dll"
}
using (var provider = new CSharpCodeProvider())
{
  var Params = new CompilerParameters(DLL.ToArray())
  {
     //parametrs build
  };
  provider.CompileAssemblyFromSource(Params, SourceCode) // compile
}

То всё работает, но ссылки из List<string> он добавляет от как бы самого проекта ( под котором он скомпилирован ) P.S: Не из папок!

А мне нужно добавить из нужной мне папки, но если я этого делаю (см 1-ый пост ) то получаю ошибку о том что нельзя добавить библиотеки .dll из разных папок. Как мне получить нужные мне библиотеки и добавить их в сборку я не знаю как.

[Что предпринимал? ]

Попробовал удалить из того файла который компилируется ссылки (usings).

Попробовал удалить файл packages.config

Но всё безрезультатно.

Answer 1

По умолчанию компилятор добавляет ссылки на системные сборки, прописанные в файле csc.rsp в его каталоге. Добавьте параметр компилятора nostdlib или noconfig, если вам это не нужно

На самом деле, это не работает. Поведение Roslyn отличается от традиционного С#-компилятора в том, что добавление опции /nostdlib не имеет никакого эффекта, все равно будет добавлена ссылка на mscorlib 4.0. Единственный способ не добавлять ссылку на нее, это установить свойство CoreAssemblyFileName на путь к другой версии mscorlib и не добавлять ссылку ни одну сборку, зависимую от "ненужной" версии.

READ ALSO
Нахождение методов в памяти

Нахождение методов в памяти

Есть переменные (объекты) которые могут храниться как в куче так и в стекеЕсть реализации методов у какого-то класса

177
C# возврат с потока

C# возврат с потока

если Wait() уберу, то возвратиться пустой результатА так никакой асинхронности

244
Как активировать кнопку при выборе двух элементов ListView? WPF

Как активировать кнопку при выборе двух элементов ListView? WPF

Есть ListView и кнопка для сравнения двух элементов, которая должна быть активна, когда выбраны два элементаЕсть такой код XAML:

212
C# WPF Prism PopupWindowAction События окна

C# WPF Prism PopupWindowAction События окна

Хочу сделать свою "non client area" в popup окнеКак и где мне можно работать с code-behind PopupWindowAction окна? Можно ли реагировать на события PopupWindowAction окна...

135