2014-12-24 5 views
3

У меня есть приложение для Android в Xamarin Studio. Я хочу выполнить код, помещенный в текст (строка). Например, this вопрос помогите мне в приложении Visual Studio Windows. Но я не могу использовать этот ответ в Xamarin Android. Это мой пример в приложении C# Windows:Как выполнить код C# во время выполнения в Xamarin Android?

public class CodeLuncher 
{ 
    public static void LunchCSCode(string site, string typeName, string methosName) 
    { 
     try 
     { 
      var provider = CSharpCodeProvider.CreateProvider("c#"); 
      var options = new CompilerParameters(); 
      string text = new System.Net.WebClient().DownloadString(site); 

      foreach (var item in GetRefrences(text)) 
      { 
       options.ReferencedAssemblies.Add(item); 
      } 
      string code = GetCode(text); 
      var results = provider.CompileAssemblyFromSource(options, new[] { code }); 
      if (results.Errors.Count > 0) 
      { 
       foreach (var error in results.Errors) 
       { 
        Console.WriteLine(error); 
       } 
      } 
      else 
      { 
       var t = results.CompiledAssembly.GetType(typeName); 
       t.GetMethod(methosName).Invoke(null, null); 
      } 
     } 
     catch 
     { 

     } 
    } 


    static string[] GetRefrences(string text) 
    { 
     Regex regExp = new Regex("<Refrences>(.*?)</Refrences>", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); 
     string str = regExp.Match(text).Groups[1].Value; 
     List<string> retText = new List<string>(); 
     foreach (var item in str.Trim().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      retText.Add(item); 
     } 
     return retText.ToArray(); 
    } 

    static string GetCode(string text) 
    { 
     Regex regExp = new Regex("<CSharpCode>(.*?)</CSharpCode>", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); 
     string str = regExp.Match(text).Groups[1].Value; 
     return str.Trim(); 
    } 
} 
+0

Как выглядит ваш код? (который вы хотите скомпилировать) – eMi

+0

Это довольно нерегулярное требование, вы обычно можете работать без таких методов. Не могли бы вы описать, чего вы пытаетесь достичь? Может быть, есть более простой способ для вашего дела. –

+0

благодарит друга за повтор. Я хочу проверить новую версию в своем приложении из Интернета и загрузить код C# из Интернета и показать сообщение в своем приложении Android –

ответ

2

Это сложно http://developer.xamarin.com/guides/android/advanced_topics/limitations/

Since applications on Android require generating Java proxy types during the build process, it is not possible to generate all code at runtime.

С Limited Dynamic Language Support и Limited Java Generation Support вы можете узнать больше о том, что конкретно не поддерживается. Это означает, что вы можете разработать определенный код, но он не будет работать для какого-либо действительного кода C#.