У меня есть решение, которое содержит проекты С#, некоторые netstandard
2.0 и другие .net4.7
. Стартовый проект, конечно же, net47
.
В какой-то момент проект создает код с помощью CodeDom
и компилирует его с помощью CSharpCodeProvider
. Проблема в том, что на некоторых машинах он пытается скомпилировать сборку для .netstandard и терпит неудачу. Ожидается сбой: сгенерированная сборка ссылается на EF
, которая доступна только для полной .net framework
.
Как я могу заставить CSharpCodeProvider
компилироваться против .net47
?
public bool GenerateAssembly(
CodeDomBusinessCode compileUnit
, string fileName
, string assembliesPath
, out IEnumerable<string> errors)
{
var provider = new CSharpCodeProvider();
var parameters = new CompilerParameters
{
GenerateExecutable = false,
OutputAssembly = fileName,
GenerateInMemory = false
};
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Runtime.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");
parameters.ReferencedAssemblies.Add("System.ComponentModel.Composition.dll");
parameters.ReferencedAssemblies.Add(Path.Combine(assembliesPath, "EntityFramework.dll"));
parameters.ReferencedAssemblies.Add("System.ComponentModel.DataAnnotations.dll");
parameters.ReferencedAssemblies.Add(Path.Combine(assembliesPath, "GlobalE.Server.Contracts.dll"));
var results = provider.CompileAssemblyFromDom(parameters, compileUnit.Code);
if (results.Errors.Count > 0)
{
errors = results.Errors.OfType<CompilerError>().Select(x => x.ToString());
return false;
}
errors = null;
return true;
}
Ошибка:
error CS0012: The type 'System.IDisposable' is defined in an assembly
that is not referenced. You must add a reference to assembly
'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
ОБНОВЛЕНИЕ: Если я изменю все проекты на net47
(чтобы в решении не было проекта netstandard
), ошибка исчезнет, но я хочу сохранить как можно больше проектов на netstandard
.