Вводить ресурсы в исполняемый файл .net?

1

возможно ли внедрять ресурсы в.net-приложения (после компиляции), чтобы они могли использоваться приложением через потоки ресурсов?

Я читал, что.net-ресурсы отличаются от обычных ресурсов winapi.exe. Это правда?

Я знаю инструмент "хакер ресурсов", он может вносить почти что-либо в exe (насколько мне известно), но я не уверен в файлах.net. (at, work, не может проверить его прямо сейчас).

  • 0
    Зачем вам это нужно? Есть ли проблема с предоставлением ресурсов в виде отдельных файлов или включением их во время компиляции?
  • 0
    Что ж, мне было интересно, можно ли было создать в основном самораспаковывающийся исполняемый файл, в котором содержимое можно было бы добавить в экстрактор в качестве ресурса.
Показать ещё 1 комментарий
Теги:
resources
stream
inject

1 ответ

3
Лучший ответ

Если код шаблона для вашего самораспаковывающегося exe достаточно прост, я бы предложил включить его в качестве ресурса в приложение, которое вы изначально планировали написать (тот, который вы хотели использовать для обработки ресурсов).

Таким образом, вы можете использовать комбинацию С# CodeDomProvider и ResourceWriter для создания автономного exe файла с вашими желаемыми ресурсами, испеченными в.

В принципе, поток выглядит так:

  • Извлеките шаблон для своего "самораспаковывающегося исполняемого файла" из вашего приложения (встроенного в файл ресурсов - этот файл содержит метод Main(string args[]) вашей программы в текстовом формате)
  • Напишите необходимые ресурсы для потока ресурсов
  • Создайте CodeDomProvider и вызовите CompileAssemblyFromSource с параметрами, которые определяют поток ресурсов, созданный вами на предыдущем шаге

Изменить: Вот рабочий пример. Он вставляет string Hello World! (из файла в виде byte[] чтобы показать, что вы можете использовать эту концепцию с данными двоичного ресурса) в консольное приложение:

using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.IO;
using System.Resources;

namespace DynamicEmbed
{
    class Program
    {
        static void Main(string[] args)
        {
            var parameters = new CompilerParameters
            {
                GenerateExecutable = true,
                OutputAssembly = Path.Combine(Environment.CurrentDirectory, Path.GetTempFileName()) + ".exe",
            };

            // Based on the code your template uses, these will need to change
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("System.Linq.dll");

            // Create the embedded resource file on disk
            string embeddedResourceFile = Path.GetTempFileName();
            using (var rw = new ResourceWriter(embeddedResourceFile))
            {
                var tempFile = Path.GetTempFileName();
                File.WriteAllText(tempFile, "Hello, World!");

                rw.AddResourceData("my.resource.key", "ResourceTypeCode.ByteArray", File.ReadAllBytes(tempFile));
            }

            // Embed the resource file into the exe
            parameters.EmbeddedResources.Add(embeddedResourceFile);

            // Source code for dynamically generated exe
            string source =
@"
using System;
using System.Linq;
using System.Resources;

namespace DynamicallyEmbeded
{
    class Program
    {
        static void Main(string[] args)
        {
            var resourceName = typeof(Program).Assembly.GetManifestResourceNames()[0];
            Console.WriteLine(""Embedded resource name: {0}"", resourceName);

            var stream = typeof(Program).Assembly.GetManifestResourceStream(resourceName);
            var resourceData = new byte[] { };
            using (var rr = new ResourceReader(stream))
            {
                var resourceType = """";
                rr.GetResourceData(""my.resource.key"", out resourceType, out resourceData);
            }

            var contents = new string(resourceData.Select(x => (char)x).ToArray());
            Console.WriteLine(""Embedded resource contents: {0}"", contents);

            Console.Write(""Press any key to continue . . ."");
            Console.ReadKey();
        }
    }
}";

            // Create the code
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            var results = provider.CompileAssemblyFromSource(parameters, source);

            // Start the program (just to show it worked)
            if (results.Errors.Count == 0)
            {
                Process.Start(parameters.OutputAssembly);
            }
        }
    }
}

  • 0
    Подождите, поэтому я должен в основном вставить код как STRING в мой «упаковщик», чтобы упаковщик мог затем скомпилировать эту строку вместе с ресурсом в приложение? Это возможно?
  • 0
    Да, это возможно. Причина, по которой мне нравится это решение, заключается в том, что оно позволяет полностью контролировать конечный результат (в отличие от «взлома ресурсов», который допускает только изменение ресурсов - это решение позволяет вам потенциально изменять логику программы).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню