我有一个.NET可执行文件。
对于这个可执行文件,我需要将它与其配置合并在一起以获得一个文件。
此配置可以是任何内容,不仅是app.config文件,而且它是静态的,并且在合并后永远不会更改。但在合并之前它将是动态的。所以我最终会得到许多可执行文件,每个可执行文件都有不同的配置内置。
合并过程将以编程方式运行,配置为参数,需要相当快。
有人有类似的问题吗?我正在考虑使用ILMerge与资源合并,但我不知道它是否可以做到。或者我可以使用devenv构建整个exacutable,这需要在PC上安装VisualStudio,即合并,但情况并非总是如此。而且我认为它不够快。
编辑: 在环顾四周并尝试一些事情之后,也许Mono.Cecil可以完成这项工作。在我的可执行文件中,我将创建一个静态Configuration类,它将具有我的配置属性。使用IL重写,我将更改这些属性返回的内容。对此有何意见?
答案 0 :(得分:1)
您可以将文件的构建属性更改为Embedded Resource,将Copy to Output更改为false。然后,要获取配置信息,请使用以下代码:
string ReadEmbeddedResource(string fileName) {
Assembly app = Assembly.GetExecutingAssembly();
// This will be the fully-qualified name
Stream resource = app.GetManifestResourceStream(app.GetName().Name + "." + fileName);
StreamReader reader = new StreamReader(resource);
return reader.ReadToEnd();
}
现在,app.config文件不应再复制到您的构建目录中,您仍然可以从您的exe中引用。
答案 1 :(得分:0)
您可以使用visual studio附带的“Embedded Resource”选项。从解决方案资源管理器,右键单击,选择属性中选择要合并到EXE的文件。在属性窗口中,将“Build Action”设置为“Embedded Resource”。按照惯例将该文件添加到项目资源中。
答案 2 :(得分:0)
因为托管编译器输出的EXE格式在技术上仍然是PE格式,所以我会在PE的末尾创建一个新的部分,将其标记为“READ ONLY”并将我的数据放在那里。但我认为这对你正在寻找的东西有点过分了
答案 3 :(得分:0)
您在寻找类似嵌入式数据库的东西吗?
然后在您的构建中,您可以让DB-prep成为流程中的一个步骤,在编译项目/解决方案之前将正确的DB复制到您的解决方案中。
我们这样做是为了修改预构建的程序集版本文件,但任何自动构建工具(MSBuild,NAnt)都可以通过一些创造力来实现这一点。