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

时间:2017-11-10 09:43:01

标签: c# roslyn codedom

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

2 个答案:

答案 0 :(得分:1)

根据您的错误,应该添加“ netstandard.dll”作为引用,并且可能由于此注释而导致在.net 4.7中,“ System.IDisposable”在“ mscorlib.dll”中,而在.netstatndard中是“ netstandard.dll”。

答案 1 :(得分:-1)

尝试一下

var options = new Dictionary<string, string> 
              {
                  { "CompilerVersion", "v4.7" }
              };
var provider = new CSharpCodeProvider(options);