2012-03-19 124 views
6

我们希望为客户提供为客户制作基于我们的定制exes的能力。使用不同的资源在运行时创建副本exe文件

即,基本上能够使用嵌入在其中的不同xml配置文件来制作exe副本。 “包含在安装中”不是一种选择 - 我们希望这看起来好像是为我们客户的客户定制的。我正在考虑在运行时编写一个DLL(包括资源(使用AssemblyBuilder)),然后调用ILMerge将它嵌入到最终的exe文件中,但这比我想要的更加恶意。

所以这是一个很高的问题,但也许值得问一下:是否有一个.NET库允许修改.NET EXE的资源,这可以避免整个“DLL拥有由ILMerge嵌入的资源”位?

或者,还有更好的方法来达到这个目标吗?

回答

2

听起来像很多工作,以取代它已经编译后的工作。 我会用构建脚本,参数和不同的资源文件来做到这一点。

+0

这会不会要求给予客户端项目的全部源代码? – Mania 2012-03-19 13:57:38

+0

不,您需要获取要替换的资源并为每个客户端分配一个资源文件。将所有资源存储在不同的文件夹中。 ClientA ... ClientB,并且在编译 – 2012-03-19 14:00:24

+0

Nono之前,当您为ClientA构建资源文件时,将从该文件夹中复制该资源文件,这适用于我们客户的客户端。如在一次删除。我们的客户需要能够定制特定于其客户的程序 - 不同的标识,不同的选项,不同的措辞。这一切都很容易通过XML文档实现,不幸的是,现在我必须成为一个可以做到这一点的人。我们希望我们的客户能够做到这一点。稍微复杂一些。 – Mania 2012-03-19 15:06:17

0

虽然这不是解决此问题的方法,但有一个库允许您更改编译的可执行文件的嵌入式资源,Cecil

嵌入的资源与塞西尔:

命名空间中的夹杂物:

using Mono.Cecil; // supports both net and mono 

嵌入资源:

static void Main(string[] args) 
    { 
     string pathToExecutable = "Target.exe"; 

     byte[] encoding = Encoding.Unicode.GetBytes("<Data><!-- data goes here --></Data>"); 

     var resource = new EmbeddedResource(
       "ConfigurationFile", 
       ManifestResourceAttributes.Private, 
       encoding); 

     var asm = AssemblyDefinition.ReadAssembly(pathToExecutable); 

     asm.Modules.FirstOrDefault().Resources.Add(resource); 

     asm.Write(pathToExecutable); 
    } 
相关问题