-1

そう、

次のコードをテキストとして持っています。

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すでにタグでクラスをマークしていますが、以下のエラーが引き続き発生します。

アセンブリ '3k0rfezm、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null' のタイプ 'EntityModels.ActionInstance' は、シリアル化可能としてマークされていません。

ここから先の進め方がよくわかりません。残念ながら、CSharpCodeProvider と BinaryFormatter は要件の一部です。どんな助けでも本当に感謝しています。

乾杯!

4

1 に答える 1

-1

犯人を見つけた!

どうやら、この compile メソッドをループで呼び出しているため、[Serializable()]まだマークしていない古い設計図コードがあるようです。これにより、一部のオブジェクトがSerializableマークなしでコンパイルされました。私は次のようにチェックしました:

Type x = act.GetType();

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

そして彼らの何人かは戻ってきfalseました。

これがいつかどこかで誰かにも役立つことを願っています。

乾杯!

于 2015-02-26T11:28:26.770 に答える