c# - 如何强制 CSharpCodeProvider 针对特定目标框架进行编译?

标签 c# roslyn codedom

我有一个解决方案,其中包含 c# 项目、一些 netstandard 2.0 和其他 .net4.7。启动项目当然是net47

在某一时刻,该项目使用 CodeDom 创建代码,并使用 CSharpCodeProvider 对其进行编译。问题是,在某些机器上,它尝试编译 .netstandard 的程序集,但失败了。失败是预料之中的:生成的程序集引用 EF,它仅适用于完整的 .net 框架

如何强制 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 尽可能。

最佳答案

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

关于c# - 如何强制 CSharpCodeProvider 针对特定目标框架进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219778/

相关文章:

c# - 如何使用其泛型参数是我创建的类型的 CodeDOM 创建泛型类?

c# - __makeref 作为在 C# 中获取引用值的一种方式?

c# - Roslyn:如果尚未从类继承,如何将泛型类添加到继承的基列表?

c# - System.NotSupportedException - 无法比较“System.Linq.IQueryable”类型的元素

c# - 罗斯林 : Get Current Project/Get Current Doc that is selected

c# - 如何使用 roslyn 创建数字文字标记?

c# - 如何使用 CodeDOM 初始化对象?

c# - 如何生成c#代码?

c# - 删除 Linq 查询中的 WHERE 子句

c# - UWP ListView 数据模板绑定(bind)