如何在使用roslyn编译期间向程序集释放资源?

时间:2016-04-19 14:29:50

标签: c# roslyn

我有一个C#应用程序,我用Roslyn编译但在编译后它没有启动,也没有显示窗口。 我在日志中发现了这个例外:

  

System.Resources.MissingManifestResourceException ...确保“[Project] .Properties.Resources.resources”已正确嵌入或链接到
  程序集“[Project]”在编译时,或者所有所需的附属程序集都是可加载和完全签名的。

//I have tested the below code but it doesn't work
//the exception is still thrown
List < string > ListOfResxFile = GetListOfResxFiles(project);
if (ListOfResxFile.Count == 0) {
    EmitResult result = compilation.Emit(jaryan);
} else {
    List < ResourceDescription > lr = new List < ResourceDescription > ();
    foreach(var item in ListOfResxFile) {
        string fn = Path.GetFileName(item);
        lr.Add(new ResourceDescription(fn, () =  > File.OpenRead(item), false));
    }
    EmitResult result = compilation.Emit(jaryan, manifestResources : lr.ToArray());
}

我使用了resgen并转换了属性目录中的* .resx文件 每个项目到Resoures.resources文件并添加此文件而不是* .resx文件,但它不起作用。

我想知道如何添加图标,jpeg文件以及如何输出文件等资源。

2 个答案:

答案 0 :(得分:0)

resources parameter传递给Emit(),作为RES格式的流。

答案 1 :(得分:0)

首先需要将它们编译为* .resources,其中包含:

using (var w = new ResourceWriter(resources))
{
    using (var r = new ResXResourceReader(resx))
    {
        r.BasePath = Path.GetDirectoryName(resx);
        var e = r.GetEnumerator();
        while (e.MoveNext())
        {
            item = (DictionaryEntry)e.Current;
            w.AddResource(item.Key as string, item.Value);
        }
    }
}

ResourceDescription中的ResourceName需要是资源所在的默认命名空间+文件夹+ filename.resources。如果default namespace是Queue,则资源驻留在Properties文件夹中,资源文件名是Resources.resx,则ResourceName等于Queue.Properties.Resources.resources