【问题标题】:Dynamically compiled project losing resources动态编译项目丢失资源
【发布时间】:2016-09-10 00:41:42
【问题描述】:

我需要动态编译大项目的源代码,输出类型可以是Windows应用程序或类库。 代码执行得很好,可以制作 .dll 或 .exe 文件,但问题是,当我尝试制作 .exe 文件时 - 它会丢失项目图标等资源。结果文件不包含程序集信息。

有什么办法解决这个问题吗? (预期结果应该是相同的,即 Visual Studio 2015 中项目文件的手动构建功能)。 谢谢!

var workspace = MSBuildWorkspace.Create();
//Locating project file that is WindowsApplication
var project = workspace.OpenProjectAsync(@"C:\RoslynTestProjectExe\RoslynTestProjectExe.csproj").Result;
var metadataReferences = project.MetadataReferences;

// removing all references
foreach (var reference in metadataReferences)
{
  project = project.RemoveMetadataReference(reference);
}

//getting new path of dlls location and adding them to project
var param = CreateParamString();  //my own function that returns list of references
foreach (var par in param)
{
  project = project.AddMetadataReference(MetadataReference.CreateFromFile(par));
}

//compiling 
var projectCompilation = project.GetCompilationAsync().Result;
using (var stream = new MemoryStream())
{
  var result = projectCompilation.Emit(stream);
  if (result.Success)
  {
   /// Getting result 

   //writing exe file
   using (var file = File.Create(Path.Combine(_buildPath, fileName)))
   {
       stream.Seek(0, SeekOrigin.Begin);
       stream.CopyTo(file);
   }
  }
}

【问题讨论】:

标签: c# roslyn


【解决方案1】:

我们从未真正设计工作区 API 来包含您需要像这样发出的所有信息;特别是当您调用 Emit 时,您可以传递一个 EmitOptions,其中包括资源信息等。但是我们没有公开这些信息,因为没有充分考虑这种情况。我们已经done some of the work in the past to enable this,但最终从未合并它。您可能希望考虑提交错误,以便我们在某处正式提出请求。

那你能做什么?我认为有几个选择。您可能考虑根本不使用 Roslyn,而是修改项目文件并使用 MSBuild API 构建它。不幸的是,我不知道您最终要在这里实现什么(如果您提到它会有所帮助),但是构建项目所涉及的不仅仅是编译器调用。更改引用也可能会更改其他内容。

当然,也可以自己更新 MSBuildWorkspace 以通过此操作。如果您要修改 Roslyn 代码,您会看到我们 implement a series of interfaces named "ICscHostObject#" (where # is a number) and we get passed the information from MSBuild to that。看起来我们已经将其存储在命令行参数中,因此您可以将其传递给我们的命令行解析器并以这种方式取回您需要的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多