如何在CSharpCodeProvider上关闭.NET 4.5功能?

时间:2017-11-13 14:18:17

标签: c# .net

我使用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版本进行编译?

2 个答案:

答案 0 :(得分:1)

专门针对.NET 4.0 Framework形状的方法是执行MSBuild在默认情况下解析.NET 4.0项目中的程序集引用时所执行的操作,目标是由Windows SDK(由VS安装)部署的引用程序集。安装到C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0的引用程序集表示.NET 4.0的Framework二进制文件的公共表面区域 - 引用这些二进制文件将使您的应用程序以子集为目标.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

答案 1 :(得分:0)

我认为您必须使用/ 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);
        }
    }");