简体   繁体   中英

Building Program with unsafe code in Codedom

I'm trying to compile some unsafe code from an application using Codedom, but everytime I get an error saying I must use "/unsafe." I've googled the issue and added:

Parameters.CompilerOptions = "/unsafe";

To my codedom code. Are there any simple solutions for this?

Edit: if it wasn't already clear, my solution didn't work.

Edit: Here is the class.

        public static bool Compile(string EXE_Name, string Source)
    {
        var Compiler = new CSharpCodeProvider();
        var Parameters = new CompilerParameters
        {
            CompilerOptions = "/unsafe"
        };
        CompilerResults cResults = default(CompilerResults);

        Parameters.GenerateExecutable = true;
        Parameters.OutputAssembly = EXE_Name;
        Parameters.ReferencedAssemblies.Add(typeof(System.Xml.Linq.Extensions).Assembly.Location);
        Parameters.ReferencedAssemblies.Add("System.dll");
        Parameters.ReferencedAssemblies.Add("System.Core.dll");
        Parameters.ReferencedAssemblies.Add("System.Data.dll");
        Parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
        Parameters.ReferencedAssemblies.Add("System.Deployment.dll");
        Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
        Parameters.ReferencedAssemblies.Add("System.Drawing.dll");
        Parameters.ReferencedAssemblies.Add("System.Xml.dll");

        Parameters.CompilerOptions = " /target:winexe";
        Parameters.TreatWarningsAsErrors = false;

        cResults = Compiler.CompileAssemblyFromSource(Parameters, Source);

        if (cResults.Errors.Count > 0)
        {
            foreach (CompilerError CompilerError_loopVariable in cResults.Errors)
            {
                CompilerError error = CompilerError_loopVariable;
                MessageBox.Show("Error: " + error.ErrorText, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return false;
        }
        else if (cResults.Errors.Count == 0)
        {
            return true;
        }
        return true;
    }

It works for me - perhaps you weren't setting the parameters correctly?

using System.CodeDom.Compiler;
using Microsoft.CSharp;

class Test
{
    public static void Main(string[] args)
    {
        var compiler = new CSharpCodeProvider();
        var parameters = new CompilerParameters { 
            CompilerOptions = "/unsafe"
        };
        var source = "unsafe struct Foo {}";
        var result = compiler.CompileAssemblyFromSource(parameters, source);
        // No errors are shown with the above options set
        foreach (var error in result.Errors)
        {
            Console.WriteLine(error);
        }
    }
}
var Parameters = new CompilerParameters
    {
        CompilerOptions = "/unsafe"
    };

and later:

Parameters.CompilerOptions = " /target:winexe";

You just replace "/unsafe" with " /target:winexe". Use:

Parameters.CompilerOptions += " /target:winexe";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM