Подтвердить что ты не робот

Как встроить сборку спутника в файл EXE

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

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

4b9b3361

Ответ 2

Короткий ответ: да, есть программа под названием Assembly Linker (AL.exe), которая будет вставлять сборки таким образом. Его основным вариантом использования является локализация, звучит так, что вам тоже нужно. Если это так, это должно быть просто.

Например:

al/t: lib/embed:strings.de.resources/культура: de/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

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

Ответ 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;
    }
}

Ответ 4

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