如何强制CSharpCodeProvider为特定的目标框架进行编译?

问题描述 投票:5回答:1

我有一个包含c#项目,一些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上保留尽可能多的项目。

c# roslyn codedom
1个回答
0
投票

尝试一下

var options = new Dictionary<string, string> 
              {
                  { "CompilerVersion", "v4.7" }
              };
var provider = new CSharpCodeProvider(options);
© www.soinside.com 2019 - 2024. All rights reserved.