C#从项目生成动态可执行文件

时间:2015-10-23 17:39:14

标签: c#

我想生成一个exe文件,其中包含来自另一个C# exe的代码中的一些更改。 我知道可以使用.cs轻松编译classCodeDom.Compiler 我想知道的是如何使用“资源”,“设置”,“表单”和其他元素编译项目。

CSharpCodeProvider.CompileAssemblyFromSource(CompilerParameters, sources[]);

所以,问题是我在哪里可以添加所有资源,设置和表单(.resx)? 我可以使用byte[]个流来完成。没有拆开项目的拉链。

对不起英语和mby愚蠢的问题。我希望有人能帮助我...

例如:我有资源文件'pic.png'的byte []数组,我想把它作为嵌入资源附加到编译的exe文件中。

1 个答案:

答案 0 :(得分:1)

您应该了解Microsoft在Microsoft.CodeAnalysis代码名称" Roslyn"中提供的新编译器服务。 Roslyn为您提供了编译代码和动态内容的方法,包括在内存中创建和编译完整的解决方案和项目。

我认为您正在寻找的东西可以通过Roslyn实现。见下面的样本:

class Program
    {
        static void Main()
        {
            var syntaxTree = SyntaxTree.ParseCompilationUnit(
@"using System;
using System.Resources;
namespace ResSample
{
    class Program
    {
        static void Main()
        { 
             ResourceManager resMan = new ResourceManager(""ResSample.Res1"", typeof(Program).Assembly);
             Console.WriteLine(resMan.GetString(""String1""));
        }
    }
}");
            var comp = Compilation.Create("ResTest.exe")
                                  .AddReferences(new AssemblyNameReference("mscorlib"))
                                  .AddSyntaxTrees(syntaxTree);
            var resourcePath = "ResSample.Res1.resources"; //Provide full path to resource file here
            var resourceDescription = new ResourceDescription(
                resourceName: "ResSample.Res1.resources",
                dataProvider: () => File.OpenRead(resourcePath),
                isPublic: false);
            var emitResult = comp.Emit(
                executableStream: File.Create("ResTest.exe"),
                manifestResources: new[] { resourceDescription });
            Debug.Assert(emitResult.Success);
        }

Original Source here

在第dataProvider: () => File.OpenRead(resourcePath),行,您可以提供自己的“FileStream”#39;比如资源文件的() => return _myResourceStream)