【问题标题】:How to turn off .NET 4.5 features on CSharpCodeProvider?如何关闭 CSharpCodeProvider 上的 .NET 4.5 功能?
【发布时间】:2017-11-13 14:18:17
【问题描述】:

我正在使用 CSharpCodeProvider 来编译程序集。当用户使用 .NET Framework 4.0 以上版本的功能和类时,我想得到错误。

例如,如果在安装了 4.5 版本 .NET 框架的机器上运行此代码,CSharpCodeProvider 将使用 .NET 4.5 API(例如 System.Reflection.ReflectionContext)成功编译

var options = new Dictionary<string, string> { { "CompilerVersion", "v4.0" } };
var cs = new CSharpCodeProvider(options);
var compilerParams = new CompilerParameters();
var r = cs.CompileAssemblyFromSource(
    compilerParams,
    "namespace Sample {public class SampleClass{private System.Reflection.ReflectionContext a;}}");

有人知道如何指定使用唯一的 4.0 版本进行编译吗?

【问题讨论】:

  • .NET 4.0 不再受支持。最早支持的 .NET 版本是 4.5.2。 4+ 版本是二进制替换,因此您可能已经在更高版本上运行
  • 换句话说,如果该代码生成 4.5 功能,那是因为 .NET 4.0 已被更新版本取代
  • System.CodeDom 始终以已安装的 .NET 4.x 版本为目标,参考程序集来自 c:\windows\microsoft.net。所以没有选项可以选择不同的版本号,您必须通过将您自己的程序定位到足够高来确保所需的版本可用。或者,我猜,在这种情况下,通过强制用户降级。他不会那样做的。
  • 如果您对特定语言版本感兴趣而不是 .Net 版本,可以尝试将/langversion 传递给CompilerParamters
  • 在 Visual Studio 中创建项目时,可以选择 .NET 框架版本,因此无法构建具有 4.5 功能的 4.0 .net 项目。有什么想法他们是如何做到的吗?

标签: c# .net


【解决方案1】:

专门针对 .NET 4.0 Framework 形状的方法是,默认情况下,在解析 .NET 4.0 项目中的程序集引用时执行 MSBuild 所做的操作,定位由 Windows SDK(由 VS 安装)部署的引用程序集。安装到 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0 的参考程序集代表 .NET 4.0 框架二进制文件的公共表面区域 - 引用这些二进制文件将使您的应用程序以子集为目标.NET 4.5 在仅安装了 .NET 4.0 的系统上可用。

https://connect.microsoft.com/VisualStudio/feedback/details/783278/compilerversion-is-not-being-taken-into-account-v4-0-in-a-machine-with-net-4-5-installed

【讨论】:

    【解决方案2】:

    我认为您必须使用 /nostdlib 选项链接另一个 mscorlib.dll。

    List<String> references = new List<string>();
    
    String mscorlib = Path.Combine(              
        Environment.GetFolderPath(Environment.SpecialFolder.Windows),
        @"Microsoft.NET\Framework\v4.0.30319\mscorlib.dll"
    );
    
    references.Add(mscorlib);
    // Add other references...
    
    var provider = new CSharpCodeProvider(new Dictionary<String,String> {{"CompilerVersion", "v4.0"}});
    
    var parameters = new CompilerParameters(references.ToArray(), "MyApp.exe");
    parameters.GenerateExecutable = true;
    parameters.CompilerOptions = "/nostdlib";              
    
    var results = provider.CompileAssemblyFromSource(parameters,
        @"using System;
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(""CLR Version: "" + Environment.Version);
            }
        }");
    

    【讨论】:

    • 这是一个 2.0 的库,而不是 4.0。没有单独的 4.0 库 - 4.0 之后的版本是二进制替换。安装一个较新的,即使项目标记为 4.0,您也可以在其上运行。此外,不再支持 4.0。
    • 抱歉打错了。我修好了,但无论如何它都行不通。 NET 4.5 是 4.0 版的真正就地更新......所以我很害怕,但可能没有解决这个问题的方法。
    • 在 Visual Studio 中创建项目时,可以选择 .NET 框架版本,因此无法构建具有 4.5 特性的 4.0 .net 项目。有什么想法他们是如何做到的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-10-21
    • 2014-05-24
    • 2013-03-27
    相关资源
    最近更新 更多