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

本文关键字:动态 可执行文件 项目 | 更新日期: 2023-09-27 18:19:03

我想生成一个exe文件,其中包含来自另一个C# exe的代码更改。我知道使用CodeDom.Compiler可以很容易地编译.cs单个class我想知道的是如何用'Resources', 'Settings', 'Forms'和其他元素编译一个项目。

CSharpCodeProvider.CompileAssemblyFromSource(CompilerParameters, sources[]);

所以,问题是我在哪里可以添加所有资源,设置和形式(.resx)?我可以用byte[]流来做吗?没有解压项目的zip。

对不起,我的英语不好,我的问题很愚蠢。我希望有人能帮助我……

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

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

您应该了解微软在Microsoft.CodeAnalysis中提供的新编译器服务,代码名为"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);
        }

原文在此

dataProvider: () => File.OpenRead(resourcePath),行,你可以像() => return _myResourceStream)一样为你的资源文件提供你自己的'FileStream'。