2015-02-26 8 views
-1

Итак,Как скомпилировать сериализуемую объект во время выполнения с помощью C# CSharpCodeProvider и BinaryFormatter

У меня есть следующий код в виде текста:

using digitracktest.DigiTrack.CoreLogic; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Script.Serialization; 
using System.Runtime.Serialization; 

namespace EntityModels 
{ 
    [Serializable()] 
    public class ActionInstance : IAction 
    { 
     private string _id; 

     public string id { 
      get { return _id; } 
      set { _id = value; } 
     } 

     public void execute() 
     { 
      //Rest of the codes 
     } 
    } 
} 

Я хотел бы скомпилировать код выше во время выполнения с помощью CSharpCodeProvider.

И ниже, как я компилирую:

CSharpCodeProvider provider = new CSharpCodeProvider(); 
    CompilerParameters parameters = new CompilerParameters(); 

    parameters.ReferencedAssemblies.Add("System.dll"); 
    parameters.ReferencedAssemblies.Add("System.Core.dll"); 
    parameters.ReferencedAssemblies.Add("mscorlib.dll"); 

    parameters.GenerateInMemory = false; // True - memory generation, false - external file generation 
    parameters.GenerateExecutable = false; // True - exe file generation, false - dll file generation 


    CompilerResults results = provider.CompileAssemblyFromSource(parameters, a.src); 
    _CompileResults = results; 

    if (results.Errors.HasErrors) 
    { 
     List<string> errors = new List<string>(); 
     results.Errors.Cast<CompilerError>().ToList().ForEach(error => errors.Add(error.ErrorText)); 

     return new { isSuccess = false, errors = errors }; 
    } 
    else 
    { 
     Assembly assembly = results.CompiledAssembly; 
     IAction act = (IAction)assembly.CreateInstance("EntityModels.ActionInstance"); 
     act.id = a.actionId; 

     Stream stream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/a/") + a.id + ".dat", FileMode.Create, FileAccess.ReadWrite, FileShare.Read); 
     BinaryFormatter serializer = new BinaryFormatter(); 
     serializer.Serialize(stream, a); 
     stream.Close(); 

     return new { isSuccess = true }; 
    } 

Вопрос заключается в том, что после компиляции, мне нужно сериализовать его с помощью BinaryFormatter и сохранить его в файл.

Хотя я уже отмечал класс с Serializable тегом, я получаю ошибку ниже:

типа 'EntityModels.ActionInstance' в 3k0rfezm Ассамблеи », Version = 0.0.0.0, культура = нейтральный, PublicKeyToken = null 'is не помечено как сериализуемое.

Я действительно не знаю, как это исходит отсюда. К сожалению, CSharpCodeProvider и BinaryFormatter являются частью требований. Любая помощь действительно ценится.

Cheers!

ответ

-1

Я нашел преступника!

По-видимому, поскольку я называю этот метод компиляции в цикле, по-видимому, есть старые коды чертежей, которые я еще не отметил как [Serializable()]. Это привело к некоторому объекту, скомпилированному без знака Serializable. Я проверил по:

Type x = act.GetType(); 

Console.WriteLine("Is Object Serializable: " + x.IsSerializable); 

и некоторые из них вернулись false.

Надеюсь, что это когда-нибудь поможет кому-то.

Cheers!

+0

спасибо за downvoting этот бесполезный ответ. [^ _ ^] –