Вопрос

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

Можно ли встроить его прямо в бинарник?

Это было полезно?

Решение

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

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

Другие советы

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

Например:

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

или

al.exe /cultural:en-US /out:bin\Debug\en-US\HelloWorld.resources.dll /embed:Resources\MyResources.en-US.resources,HelloWorld.Resources.MyResources.en-US.resources / шаблон:bin\Debug\HelloWorld.exe

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

Другой вариант — внедрить другие сборки как 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;
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top