2009-09-21 45 views
12

我,我需要一个C#项目分配作为一个单一的EXE文件,该文件是不是一个安装程序,但真正的程序问题。它还需要包含当前驻留在子目录中的翻译。如何嵌入卫星组装成EXE文件

是否有可能直接将其嵌入到二进制?

回答

10

简短的回答是肯定的,有一个叫做Assembly Linker (AL.exe)程序,将通过这种方式嵌入组件。它的主要用例是本地化,听起来就是你所需要的。如果是这样,它应该是直截了当的。

例如:

人/吨:LIB /embed:strings.de.resources /培养:德/out:MyApp.resources.dll

Al.exe工具/文化:EN-US /out:bin\Debug\en-US\HelloWorld.resources.dll /embed:Resources\MyResources.en-US.resources,HelloWorld.Resources.MyResources.en-US.resources/template:bin \ Debug \ HelloWorld.exe

This是它MSDN的与上述实施例和以上的例子漫游。你也可以阅读this blog post,这可以进一步解释它的用法。

+0

到博客文章的链接被打破。 – 2012-07-04 15:10:37

+2

据我所知,al.exe可以用来创建卫星程序集,但我不认为它可以将多个文化资源合并到一个程序集中,这就是问题的要求。 – 2012-07-04 18:02:47

3

另一种选择是嵌入其他组件作为EmbededResource。然后处理应用程序域AssemblyResolve,从这里您可以从资源中读取程序集并将其加载到运行时。类似以下内容:

public class HookResolver 
{ 
    Dictionary<string, Assembly> _loaded; 

    public HookResolver() 
    { 
     _loaded = new Dictionary<string, Assembly>(StringComparer.OrdinalIgnoreCase); 
     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    } 

    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     string name = args.Name.Split(',')[0]; 
     Assembly asm; 
     lock (_loaded) 
     { 
      if (!_loaded.TryGetValue(name, out asm)) 
      { 
       using (Stream io = this.GetType().Assembly.GetManifestResourceStream(name)) 
       { 
        byte[] bytes = new BinaryReader(io).ReadBytes((int)io.Length); 
        asm = Assembly.Load(bytes); 
        _loaded.Add(name, asm); 
       } 
      } 
     } 
     return asm; 
    } 
} 
3

ILMerge将为您的应用程序创建一个exe文件。您可以从Microsoft获得download it。它将程序集合并在一起,并可以将它们内部化,以便将合并的类设置为内部。这是我用来多次创建单个文件的版本。将它集成到构建过程中非常简单。

+6

尽管可以使用翻译吗? – Svish 2010-08-01 22:48:12