2016-04-12 27 views
2


Kodda çalışma zamanında C# derlemeye çalışıyorum, sonra derlenmiş kod çağrısı işlevinden veya orijinal kodda tanımlanan bir sınıfı başlatıyorum.
kod Şu anda var:(C#) Çalışma zamanında sınıfı derleme ve orijinal koddan yöntemlerini çağırma

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.CSharp; 
using System.CodeDom.Compiler; 
using System.Reflection; 

namespace CTFGame 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string code = @" 

using System; 

namespace CTFGame 
{ 
    public class MyPlayer 
    { 
     public static void Main() 
     { 
      Console.WriteLine(""Hello world""); 
     } 
     /*public void DoTurn() 
     { 
      Program.SayHello(); 
     }*/ 
    } 
} 

"; 
      CSharpCodeProvider provider = new CSharpCodeProvider(); 
      CompilerParameters parameters = new CompilerParameters(); 
      parameters.GenerateInMemory = true; 

      CompilerResults results = provider.CompileAssemblyFromSource(parameters, code); 
      if (results.Errors.HasErrors) 
      { 
       string errors = ""; 
       foreach (CompilerError error in results.Errors) 
       { 
        errors += string.Format("Error #{0}: {1}\n", error.ErrorNumber, error.ErrorText); 
       } 
       Console.Write(errors); 
      } 
      else 
      { 
       Assembly assembly = results.CompiledAssembly; 
       Type program = assembly.GetType("CTFGame.MyPlayer"); 
       MethodInfo main = program.GetMethod("Main"); 
       main.Invoke(null, null); 
      } 
     } 

     public static void SayHello() 
     { 
      Console.WriteLine("I'm awesome ><"); 
     } 
    } 
} 

Şimdi, çalışma zamanı yüklü yöntemi 'Ana' Running bir başarıdır ve ileti "Merhaba dünya" basılır. Sorun burada başlıyor: orijinal kodda "SayHello" adında bir yöntem var. Bu yöntemi çalışma zamanı yüklü kodumdan aramak istiyorum. Ben "DoTurn" yöntemi yorumsuz
, bir derleyici hatası çalışma zamanı içinde gösterilir:

Error #CS0103: The name 'Program' does not exist in the current context 



Sorum şu - bu mümkün olduğunu ve nasıl?

Çalışma zamanı yüklenmiş kodu aynı ad alanına koymak yardımcı olmaz (ve bu mantıklıdır), bu yüzden bunu yapmanın doğru yolu nedir?

Teşekkürler. Geçerli derlemesine ekleme

+2

Sen derlemesine eklemeniz gerekir. – SLaks

+1

Roslyn'i kullanmayı düşünün. – SLaks

+0

Belki de dinamik olarak derlemeden önce kodunuzu derlemek için düşünmelisiniz. –

cevap

4

sorunu çözüldü:

hakkında
CSharpCodeProvider provider = new CSharpCodeProvider(); 
CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateInMemory = true;     
//The next line is the addition to the original code 
parameters.ReferencedAssemblies.Add(Assembly.GetEntryAssembly().Location); 

Daha: Compiling c# at runtime with user defined functions