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
Sen derlemesine eklemeniz gerekir. – SLaks
Roslyn'i kullanmayı düşünün. – SLaks
Belki de dinamik olarak derlemeden önce kodunuzu derlemek için düşünmelisiniz. –