如何嵌入卫星组装成EXE文件(How to embed a satellite assembly i

2019-07-18 18:12发布

我得到了我需要一个C#项目分配作为一个单一的EXE文件,该文件是不是一个安装程序,但真正的程序问题。 它还需要包括目前居住在一个子目录翻译。

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

Answer 1:

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

  • 如何嵌入您的EXE文件中应用程序的依赖DLL

也方便实施这一方案的: http://code.google.com/p/costura/wiki/HowItWorksEmbedTask



Answer 2:

简短的回答是肯定的,有一个叫做程序集链接器(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 /模板斌\调试\ HelloWorld.exe的

这是它的MSDN与上述实施例和以上的例子漫游。 你可能还需要阅读这篇博客这也解释了它的用法远一点。



Answer 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;
    }
}


Answer 4:

ILMerge会为应用程序创建一个单一的exe文件。 您可以下载它从微软。 它融合了组件一起,可内他们,使合并后的类设置为内部。 这是我用来创建单个文件发布的次数。 这是很容易集成到您的构建过程。



文章来源: How to embed a satellite assembly into the EXE file