C # CompilerResults GenerateInMemory?

Я следил за этимВопрос StackOverflow, Это самая близкая вещь, которую я могу найти, но не совсем.

Позвольте мне объяснить, какова моя конечная цель перед моим вопросом, я делаю платформу компилятора, которая поддерживает веб, поэтому я хочу делать все в памяти (не делать файлов), поэтому я хочу иметь возможность компилировать код, а затем иметь возможность ссылаться на объекты в классе, который я только что скомпилировал для произвольного тестирования. Я знаю, как это звучит небезопасно, поэтому приветствуется вклад в обеспечение безопасности.

Мой вопрос: как мне скомпилировать исходный код C # в память и создать экземпляр этого класса?

В настоящее время я нахожусь на этапе, когда я могу сгенерировать действительные .dll и импортировать и использовать их внутри VisualStudio вручную.

Мои следующие 2 шага:

загрузить сборку автоматически (Это то, что я спрашиваю здесь)Это означало бы, что мне больше не нужно указывать путь к dll и вручную получать адреса членов закрытого класса.произвольно ссылаться на его членовЭто означает, что я могу создать интерфейс к классу без предварительного знания его членов, что-то вроде того, как цикл foreach работает с парами ключ-значение.

Чтобы попробовать это полностью в памяти, я попробовал это. (источник, затем объяснение)

private object sourceToObj(string source) {
  string source = "...";  /*my class*/
  CSharpCodeProvider pro = new CSharpCodeProvider();

  CompilerParameters params = new CompilerParameters();
    params.GenerateInMemory = true;
    params.GenerateExecutable = false; 
    params.ReferencedAssemblies.Add("System.dll");

  CompilerResults res = pro.CompileAssemblyFromSource( params, source );

  Assembly DOTasm = res.CompiledAssembly;

  AppDomain domain = AppDomain.CreateDomain( "thisdomain" );
    domain.load( DOTasm , /*???*/ );
    domain.CreateInstanceAndUnwrap( DOTasm .FullName, /*???*/ );


  return /*???*/;
}

Наконец, как этот пункт в коде, я надеюсь вернуть некоторый объект, который я могу назвать свойством. Так зоветobject obj = new sourceToObj(source).class(); или что-то было бы возможно.

Если идти по этому пути, который действительно может быть неправильным, у меня останется три неизвестных.

Что такоеSystem.Security.Policy.Evidence assemblySecurity объект.Каков правильный параметр дляAppDomain.CreateInstanceAndUnwrap()Как тогда вернуть это как объект?

Конечно, этот метод может быть неправильным, он основан на ссылке выше, которая близка, но не индейка.

Изменить: После дополнительных исследований я хотел бы включить пример исходного файла.

namespace testNS {
  public partial class i18Rule {
     private string i18_Name;
     private string i18_Value;
     public void setName(string s) {
         i18_name = s;
     }
     /* Other obvious functions */
  };
};

Я считаю, что я немного продвинулся и перешел ко второму пункту моего вопроса, как создать его экземпляр.

Я пошел дальше и использовал AppDomain, чтобы содержать мою сборку. Я также пошел по пути записи на диск и чтения его в байтовом массиве, как и в этом вопросе, с которым я столкнулсяСкомпилируйте c # на лету.

/* not the final method, see Philips answer for tryLoadCompiledType which validates this works */
private void sourceToUnitTest(string source, callBack CB) {
    var pro = new CSharpCodeProvider();

    var DOMref = AppDomain.CurrentDomain.GetAssemblies()
            .Where(obj => !obj.IsDynamic) 
            .Select(obj => obj.Location)
            .ToArray();

    var Cparams = new CompilerParameters( DOMref );
        Cparams.OutputAssembly = "SOURCE.DLL";

        CompilerResults res = pro.CompileAssemblyFromSource(Cparams, source);

        Assembly asm = res.CompiledAssembly;

        Type[] allTypes =  res.CompiledAssembly.GetTypes();

        foreach (Type t in allTypes)
        {
            TryLoadCompiledType(res, t.ToString());
            Debug.WriteLine(t.ToString());
        }


        /* I don't return I do something with each type here */
}

Ответы на вопрос(1)

Ваш ответ на вопрос