1

我对运行时编译的类有问题。我有这样的2类:

头等舱

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Program.Bullet {
  public class Class1{
    private int i;
    public Class1(int j){
      i=j;
    }
  }
} 

和二等

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Program.Bullet;
namespace Program.Object {
  public class Class2{    
    public Class2(){
      Class1 c1 = new Class1(5);
    }
  }
}

这两个类我想在运行时编译并在我的项目中使用它们。所以我有编译它的功能(XmlNode 有关于 fullPath 等的数据):

private ModuleBuilder moduleBuilder;
private List<string> isCompiled;

private void Compile(XmlNode compileingClasses) {
        foreach (XmlNode compileingClass in compileingClasses) {
            string fullPath = compileingClass.Attributes["path"].InnerText;
            string type = compileingClass.Attributes["name"].InnerText; ;
            if (!isCompiled.Contains(type)) {
                isCompiled.Add(type);
                var syntaxTree = SyntaxTree.ParseFile("../../File1/File2/" + fullPath);

                var comp = Compilation.Create("Test.dll"
                    , syntaxTrees: new[] { syntaxTree }
                    , references: metadataRef
                    , options: comilationOption
                    );

                // Runtime compilation and check errors
                var result = comp.Emit(moduleBuilder);
                if (!result.Success) {
                    foreach (var d in result.Diagnostics) {
                        Console.WriteLine(d);
                    }
                    throw new XmlLoadException("Class not found " + fullPath);
                }
            }
        }
    }

是否可以获得 Class1 到 Class2 的参考?

编辑:更好的问题

是否可以在已编译时创建 MetadataReference Class1

就像是:

string fullName = bullet.Attributes["fullName"].InnerText;
var o = moduleBuilder.GetType(fullName);
metadataRef.Add(new MetadataFileReference(o.Assembly.Location));

这一抛NotSupportedException

4

1 回答 1

1

您正在尝试引用当前正在构建的程序集,我认为 Roslyn 无法做到这一点。

相反,您可以做的是Compilation从所有类中创建一个(可能SyntaxTree每个类都有一个单独的)。如果你这样做,你将不需要任何参考。

于 2013-05-26T17:48:59.983 回答