从项目生成动态可执行文件
本文关键字:动态 可执行文件 项目 | 更新日期: 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'。