Создание DLL с использованием Csharpcodeprovider и добавление ресурсов к ней - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть читатель DLL для извлечения ресурсов (изображений) из динамически создаваемой DLL.Для того, чтобы проверить это, я разработал DLL, чтобы указать требования, необходимые для моего читателя DLL для извлечения изображений.DLL работала как положено, так как я могу вручную включать изображения в папку ресурсов.Однако в процессе генерации динамической DLL я не совсем понимаю способ включения ресурсов в решение до его компиляции в DLL.

Итак, инструменты, которые у меня есть:

  1. DLLридер (работа)
  2. DLL с ресурсами изображения (работа)
  3. Динамически генерируемая DLL с ресурсом изображения (не работает)

(1) - (2) работыхорошо, (1) - (3) не удалось получить изображение

После отладки я обнаружил, что изображения не были добавлены в динамически добавляемую DLL.

Исходный код:

DLL created manually

Namespace

Изображения, включенные в ресурсы DLL, в пространстве имен с именем DLLforWPF

Когда я запускаю свое устройство чтения DLL, чтобы получить изображение и преобразовать его в BitmapImage, оно работает.

Assembly currentAssembly = Assembly.LoadFrom("DLLforWPF.dll");
string[] resources = currentAssembly.GetManifestResourceNames();
//Please see the attached image for the results
Stream myStream = currentAssembly.GetManifestResourceStream("DLLforWPF.Resources.img1.png");
            var bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = myStream;
            bitmap.CacheOption = BitmapCacheOption.OnLoad;
            bitmap.EndInit();
            bitmap.Freeze();

enter image description here

Он отображает ресурсы, которые я добавил в DLL.

Затем я приступаю к разработке решения для динамического создания DLL с помощью imag.Электронные ресурсы.Я использовал stringbuilder для создания приведенного ниже кода:

//in stringbuilder
using System;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Net.Http;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using System.Reflection;
using System.Windows.Forms;

namespace ben
{
    public class Imgstored
    {
            [STAThread]
            public static void Main(string[] args)
            {
            }
    }
}
string executable = Application.ExecutablePath;
string baseDir = Path.GetDirectoryName(executable);
CodeDomProvider compiler = new CSharpCodeProvider(options.CompilerOptions);
CompilerParameters parameters = new CompilerParameters{ OutputAssembly = "ben.dll"};
parameters.WarningLevel = 4;
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;

if (compiler.Supports(GeneratorSupport.Resources))
{
parameters.EmbeddedResources.Add($"{Application.StartupPath}\\Temp\\audio.png");
}

Я попытался изменить каталог, такой как directory \ audio1.png, и он дал мне исключение из изображения, которое не найдено.Поэтому я уверен, что ресурс указывает на каталог изображений.

Когда я запускаю DLL reader, enter image description here

Это результат моих ресурсов в динамически создаваемыхDLL.Я не могу преобразовать его в BitmapImage, так как это не ресурс изображения.Я подозреваю, что процесс добавления ресурса изображения в CSharpCodeProvider имеет какую-то ошибку, пожалуйста, сообщите мне проблему добавления ресурса с помощью CompilerParameters.EmbeddedResources.Add (путь к изображению).Результат полностью отличается от созданной вручную DLL.Есть очень ограниченный материал, касающийся добавления ресурсов в динамическую DLL через CSharpCodeProvider.Спасибо за ваше время.

1 Ответ

0 голосов
/ 24 сентября 2019

В моем функциональном коде у меня есть только что:

        FileInfo fi = new FileInfo(@".\files_freepie\curves\CurveAssembly.dll");
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters compilerparams = new CompilerParameters();
        compilerparams.OutputAssembly = @".\files_freepie\curves\CurveAssembly.dll";
        CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, filename);

имя файла - это файл для компиляции ....

я не использую

CodeDomProvider compiler = new CSharpCodeProvider(options.CompilerOptions)
...