【问题标题】:How to embed a satellite assembly into the EXE file如何将附属程序集嵌入到 EXE 文件中
【发布时间】:2010-11-30 00:55:58
【问题描述】:

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

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

【问题讨论】:

    标签: c# embed satellite-assembly


    【解决方案1】:

    简短的回答是肯定的,有一个名为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 /template:bin\Debug\HelloWorld.exe

    This 是 MSDN 的一个示例演练,其中包含上述示例等。此外,您可能还想阅读this blog post,它进一步解释了它的用法。

    【讨论】:

    • 博客文章的链接已损坏。
    • 据我所知,al.exe 可以用来创建附属程序集,但我不认为它可以将多个文化资源合并到一个程序集中,这就是问题所要求的.
    【解决方案2】:

    另一种选择是将其他程序集嵌入为 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 文件。你可以从微软download it。它将程序集合并在一起并可以将它们内部化,以便将合并的类设置为内部。这就是我多次用来创建单个文件版本的方法。集成到您的构建过程中非常容易。

      【讨论】:

        【解决方案4】:

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

        这个解决方案也很方便的实现: http://code.google.com/p/costura/wiki/HowItWorksEmbedTask

        【讨论】:

        • 此链接现已失效。
        • @pjc50 更新了网络存档链接
        猜你喜欢
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        相关资源
        最近更新 更多