csharpcodeprovider:不能使用 Process.Start()

Posted

技术标签:

【中文标题】csharpcodeprovider:不能使用 Process.Start()【英文标题】:csharpcodeprovider: Can't use Process.Start() 【发布时间】:2019-01-03 22:07:31 【问题描述】:

所以我正在制作一个 WPF 应用程序,我在其中使用 CSharpCodeProvider 来编译存储在字符串中的代码。一切都很好,除了一部分。当我尝试使用 Process.Start() 时,它给了我“找不到元数据文件‘System.Diagnostics.dll’”错误。我不知道那是什么意思。

using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Dynamically_compile_codes

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    
        public MainWindow()
        
            InitializeComponent();
        

        private void Button_Click(object sender, RoutedEventArgs e)
        

            CSharpCodeProvider codeProvider = new CSharpCodeProvider(new Dictionary<string, string>()   "CompilerVersion", txtFrameWork.Text  );
            Button button = (Button)sender;

            CompilerParameters parameters = new CompilerParameters(new[]  "mscorlib.dll","System.Core.dll","System.Diagnostics.dll", txtOutput.Text,true);
            //generate exe, not dll
            parameters.GenerateExecutable = true;
            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox.Text);

            if (results.Errors.HasErrors)
            
               results.Errors.Cast<CompilerError>().ToList().ForEach(error=> txtStatus.Text+=error.ErrorText+"/r/n");
            
            else
            
                //If we clicked run then launch our EXE
                Process.Start(txtOutput.Text);
            
        
    

这是存储在字符串中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace Hidden_Console_Application

    class Program
    
        static void Main(string[] args)
        

Process.Start("explorer.exe");
        
    

【问题讨论】:

编译器参数错误,删除“System.Diagnostics.dll”。它是一个命名空间,而不是一个程序集。 【参考方案1】:

System.Diagnostics 是一个位于 System.dll 程序集中的命名空间。 CompilerParameters 构造函数需要一个程序集名称的字符串集合,因此正在寻找一个名为 System.Diagnostics 的加载程序集,该程序集不存在。

应该是:

CompilerParameters parameters = new CompilerParameters(new[]  "mscorlib.dll","System.Core.dll","System.dll", txtOutput.Text,true);

【讨论】:

以上是关于csharpcodeprovider:不能使用 Process.Start()的主要内容,如果未能解决你的问题,请参考以下文章

使用 Csharpcodeprovider 创建 DLL 并向其添加资源

CSharpCodeProvider 编译器无法识别脚本中的父类

如何从嵌入式资源中提取文件并将其保存到磁盘?

如何防止 CompileAssemblyFromSource 泄漏内存?

在C#中调用exe程序

程序动态编译代码