我有一個類(HelloWorld.cs):使用羅斯林創建部分類 - 一個編譯在運行時
public partial class HelloWorld
{
public void SayHello()
{
var message = "Hello, World!";
var length = message.Length;
Console.WriteLine("{1} {0}", message, length);
}
}
上述類的屬性BuildAction的=編譯。
我有另一個類在一個單獨的文件(HelloWorldExtend.cs):
public partial class HelloWorld
{
public void SayHelloExtend()
{
var message = "Hello, World Extended!";
var length = message.Length;
Console.WriteLine("{1} {0}", message, length);
}
}
但類的屬性是:BuildAction的=無和複製到輸出目錄=複製如果較新的
現在主要的方法: 其使用羅斯林。
static void Main(string[] args)
{
var code = File.ReadAllText("HelloWorldExtend.cs");
var tree = SyntaxFactory.ParseSyntaxTree(code);
var compilation = CreateCompilation(tree);
var model = compilation.GetSemanticModel(tree);
ExecuteCode(compilation);
Console.ReadLine();
}
private static void ExecuteCode(CSharpCompilation compilation)
{
using (var stream = new MemoryStream())
{
compilation.Emit(stream);
var assembly = Assembly.Load(stream.GetBuffer());
var type = assembly.GetType("HelloWorld");
var greeter = Activator.CreateInstance(type);
var methodextend = type.GetMethod("SayHelloExtend");
methodextend.Invoke(HelloWorld, null);
//Works perfect
var method = type.GetMethod("SayHello");
method.Invoke(greeter, null);
//method is returned null and gives an error : {"Object reference
not set to an instance of an object."}
}
}
IS有可能使用羅斯林,得到作爲常規局部類相同的效果,其中一個類被構建期間編譯和另一個是在運行時在相同組件編譯現有的類。
不,它不工作。它給出了錯誤:類型System.BadImageFormatException'的未處理的異常出現在mscorlib.dll 其他信息:無法加載文件或程序集「從MyRoslynProject加載0字節,版本= 1.0.0.0,文化=中性公鑰= null「或它的一個依賴關係。試圖加載格式不正確的程序。 – Satyajit
@Satyajit什麼時候你會得到那個異常? 你需要認識到,在傑西的例子中,第二代碼片段需要具有其中包含了'HelloWorldBase'類型的程序集的引用,否則將無法正確編譯。 (並確保你從'HelloWorldBase'派生,而不是'helloWorldBase';))。 – Ties
謝謝。我會檢查裝配的東西。它給出了錯誤:var assembly = Assembly.Load(stream.GetBuffer());但是,那麼如何讓原始程序集包含在這部分代碼中。 – Satyajit