我想生成一个exe文件,其中包含来自另一个C#
exe
的代码中的一些更改。
我知道可以使用.cs
轻松编译class
单CodeDom.Compiler
我想知道的是如何使用“资源”,“设置”,“表单”和其他元素编译项目。
CSharpCodeProvider.CompileAssemblyFromSource(CompilerParameters, sources[]);
所以,问题是我在哪里可以添加所有资源,设置和表单(.resx
)?
我可以使用byte[]
个流来完成。没有拆开项目的拉链。
对不起英语和mby愚蠢的问题。我希望有人能帮助我...
例如:我有资源文件'pic.png'的byte []数组,我想把它作为嵌入资源附加到编译的exe文件中。
答案 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);
}
在第dataProvider: () => File.OpenRead(resourcePath),
行,您可以提供自己的“FileStream”#39;比如资源文件的() => return _myResourceStream)
。