将.NET应用程序与其配置合并

时间:2012-01-12 13:59:50

标签: .net configuration

我有一个.NET可执行文件。

对于这个可执行文件,我需要将它与其配置合并在一起以获得一个文件。

此配置可以是任何内容,不仅是app.config文件,而且它是静态的,并且在合并后永远不会更改。但在合并之前它将是动态的。所以我最终会得到许多可执行文件,每个可执行文件都有不同的配置内置。

合并过程将以编程方式运行,配置为参数,需要相当快。

有人有类似的问题吗?我正在考虑使用ILMerge与资源合并,但我不知道它是否可以做到。或者我可以使用devenv构建整个exacutable,这需要在PC上安装VisualStudio,即合并,但情况并非总是如此。而且我认为它不够快。

编辑: 在环顾四周并尝试一些事情之后,也许Mono.Cecil可以完成这项工作。在我的可执行文件中,我将创建一个静态Configuration类,它将具有我的配置属性。使用IL重写,我将更改这些属性返回的内容。对此有何意见?

4 个答案:

答案 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)都可以通过一些创造力来实现这一点。