如何将附属程序集嵌入EXE文件中

rmb*_*mbl 16 c# embed satellite-assembly

我遇到的问题是我需要将C#项目作为单个EXE文件分发,该文件不是安装程序而是真正的程序.它还需要包含当前驻留在子目录中的翻译.

是否可以将其直接嵌入二进制文件中?

Dal*_*ale 10

简短的回答是肯定的,有一个名为Assembly Linker(AL.exe)的程序将以这种方式嵌入程序集.它的主要用例是本地化,听起来就像你需要的那样.如果是这样,它应该是直截了当的.

例如:

al/t:lib /embed:strings.de.resources/culture:de /out:MyApp.resources.dll

要么

al.exe/culture:en-US /out:bin\Debug\en-US\HelloWorld.resources.dll /embed:Resources\MyResources.en-US.resources,HelloWorld.Resources.MyResources.en-US.resources /模板:BIN \调试\ HelloWorld.exe的

是MSDN的示例演练,其中包含上述示例等.您也可以阅读这篇博文,其中进一步解释了它的用法.

  • 据我所知,al.exe可用于创建附属程序集,但我不认为它可以将多个文化资源合并到一个程序集中,这就是问题所要求的. (2认同)

bin*_*all 7

这是我在互联网上看到的最简单的解决方案:

也方便实施此解决方案:http: //code.google.com/p/costura/wiki/HowItWorksEmbedTask


csh*_*net 5

另一种选择是将其他程序集作为 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;
    }
}
Run Code Online (Sandbox Code Playgroud)