Как встроить спутниковую сборку в файл EXE - PullRequest
15 голосов
/ 21 сентября 2009

У меня проблема с тем, что мне нужно распространять проект C # в виде одного EXE-файла, который является не программой установки, а реальной программой. Также необходимо включить перевод, который в данный момент находится в подкаталоге.

Возможно ли встраивать его непосредственно в двоичный файл?

Ответы [ 4 ]

10 голосов
/ 21 сентября 2009

Короткий ответ - да, есть программа под названием 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

Этот является примером прохождения этого MSDN с приведенными выше примерами и многим другим. Также вы можете прочитать это сообщение в блоге , в котором более подробно объясняется его использование.

6 голосов
/ 09 апреля 2012

Вот самое простое решение, которое я видел в интернете:

также удобна реализация этого решения: http://code.google.com/p/costura/wiki/HowItWorksEmbedTask

4 голосов
/ 21 сентября 2009

Другим вариантом является встраивание других сборок в качестве 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 голосов
/ 28 сентября 2009

ILMerge создаст один exe-файл для вашего приложения. Вы можете скачать его от Microsoft. Он объединяет сборки и может их интернализовать, чтобы объединенные классы были установлены как внутренние. Это то, что я использовал для создания отдельных файловых выпусков несколько раз. Это довольно легко интегрировать в процесс сборки.

...