2017-12-18 23 views
0

ダイナミックアセンブリのコンパイルがあります。私はあるタイプで渡します。明示的にそのプロパティをtrueに設定します。しかし、返されたオブジェクト(obj1)では、プロパティ(Complete)はまだfalseです。正しい値を取得するにはどうすればよいですか?あなたがAVPMVCxFormLayoutItemクラスまたはAVPControls参照の詳細に多くの洞察を提供しなかったことを考えるとメモリ内の動的コンパイルで偽を返します

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@" 
      using System; 
      using System.Windows.Forms; 
      using System.Diagnostics; 
      using DynamicFormDemo; 
      using DynamicFormDemo.Controllers; 

      namespace InMemoryCompiledAssembly 
      { 
       public class Control 
       { 
        public static Host ProcessCompleteScript(Host host) 
        {/* 
         if ((Ctrl.FieldValue.ToString() != string.Empty) && (Ctrl.FieldValue != null)) 
         { 
          Ctrl.Complete = true; 
         } 
         else 
         { 
          Ctrl.Complete = false; 
         } */ 
         // var t = host.Control; 
         host.Control.Complete = true; 
         MessageBox.Show(host.Control.Complete.ToString()); 
         return host; 
        } 
       } 
      }"); 
string assemblyName = Path.GetRandomFileName(); 
MetadataReference[] references = new MetadataReference[] 
{ 
    MetadataReference.CreateFromFile(typeof(object).Assembly.Location), 
    MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location), 
    MetadataReference.CreateFromFile(typeof(Debug).Assembly.Location), 
    MetadataReference.CreateFromFile(typeof(MessageBox).Assembly.Location), 
    MetadataReference.CreateFromFile(typeof(Host).Assembly.Location), 

}; 

CSharpCompilation compilation = CSharpCompilation.Create(
    assemblyName, 
    syntaxTrees: new[] { syntaxTree }, 
    references: references, 
    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); 

Assembly assembly = null; 
using (var ms = new MemoryStream()) 
{ 
    EmitResult result = compilation.Emit(ms); 

    if (!result.Success) 
    { 
     IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => 
      diagnostic.IsWarningAsError || 
      diagnostic.Severity == DiagnosticSeverity.Error); 

     foreach (Diagnostic diagnostic in failures) 
     { 
      Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage()); 
     } 
    } 
    else 
    { 
     ms.Seek(0, SeekOrigin.Begin); 
     assembly = Assembly.Load(ms.ToArray()); 
    } 
} 

Host h = new Host(); 
h.Control = AVPControls[x]; 

Type type = assembly.GetType("InMemoryCompiledAssembly.Control"); 
object obj = Activator.CreateInstance(type); 
Object obj1 = type.InvokeMember("ProcessCompleteScript", 
    BindingFlags.Default | BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, 
    null, 
    obj, 
    new object[] { h }); 


public class Host 
{ 
    public IAVPBaseControl Control { get; set; } 
} 
+0

***なぜあなたはこれをやっているのですか?***確かに、動的コンパイルを使用せずに達成しようとしていることを達成するためのより良い方法があります。 –

答えて

0

、私は次のように使用してシナリオを再作成:

public sealed class AVPMVCxFormLayoutItem 
{ 
    public bool Complete { get; set; } 
} 

私はあなたの問題を再現することができません。

Complete is true

これはあなたの問題はAVPMVCxFormLayoutItemクラス自体内にあると信じて私をリードしています。

+0

興味深い!私はこれを行かせて、私はあなたに戻ってきます – Eminem

+0

ああ..私はわずかに変更されたバージョンの(MVCxFormLayoutItem)https://documentation.devexpress.com/AspNet/DevExpress.Web.Mvc.MVCxFormLayoutItemを渡そうとしています.class – Eminem

+0

GAH !!!! Nope.Doesntの仕事のための仕事:ホストはプロパティを持つクラスプロパティAVPMVCxFormLayoutItemを持っています完了 – Eminem

関連する問題