使用 Csharpcodeprovider 创建 DLL 并向其添加资源

Posted

技术标签:

【中文标题】使用 Csharpcodeprovider 创建 DLL 并向其添加资源【英文标题】:Creating DLL using Csharpcodeprovider and adding Resources to it 【发布时间】:2020-01-23 04:13:43 【问题描述】:

我有一个 DLL 阅读器来从动态创建的 DLL 中提取资源(图像)。为了测试它,我开发了一个 DLL 来指定我的 DLL 阅读器提取图像所需的要求。 DLL 按预期工作,因为我可以手动将图像包含到资源文件夹中。但是,在生成动态DLL的过程中,我并不真正了解在将资源编译成DLL之前将其包含到解决方案中的方法。

所以我拥有的工具是:

    DLL 阅读器(工作) 带有图像资源的 DLL(工作) 使用图像资源动态生成的 DLL(无效)

(1) - (2) 效果很好, (1) - (3) 无法获取图片

调试后发现动态添加的DLL中没有添加图片。

源代码:

包含在 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();

它显示了我添加到 DLL 中的资源。

然后我继续开发一种解决方案,用图像资源动态生成 DLL。我已经使用 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 阅读器时,

这是我的资源在动态创建的 DLL 中的结果。我无法将其转换为 BitmapImage,因为它不是图像资源。我怀疑向 CSharpCodeProvider 添加图像资源的过程有一些错误,请告诉我使用 CompilerParameters.EmbeddedResources.Add(image path) 添加资源的问题。结果与手动创建的 DLL 完全不同。关于通过 CSharpCodeProvider 将资源添加到动态 DLL 中的材料非常有限。感谢您的宝贵时间。

【问题讨论】:

你的 options.CompilerOptions 是什么?我们可以看到内容吗? 嗨,Frenchy,options.CompilerOptions 中的值是 [CompilerVersion, v4.0] ,key = CompilerVersion ,Value = v4.0 【参考方案1】:

在我的功能代码中,我只有这样:

        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);

filename 是要编译的文件....

我不使用

CodeDomProvider compiler = new CSharpCodeProvider(options.CompilerOptions)

【讨论】:

我已经尝试过你编译DLL的方法,仍然没有从创建的DLL中获取资源。它编译成功,但它生成了两个文件,分别是 name.dll 和 name.Resources (0kb)。 哼不明白为什么你的不工作。有没有办法解决。我可以尝试了解您为什么有问题..? 好的确定...我将压缩 3 个解决方案并为您上传。感谢您帮助法国人。 如果您的原始问题已解决,请记住接受并投票赞成答案,如果您有其他问题,请提出新问题:***.com/help/someone-answers

以上是关于使用 Csharpcodeprovider 创建 DLL 并向其添加资源的主要内容,如果未能解决你的问题,请参考以下文章

csharpcodeprovider:不能使用 Process.Start()

CSharpCodeProvider 编译器无法识别脚本中的父类

如何从嵌入式资源中提取文件并将其保存到磁盘?

如何防止 CompileAssemblyFromSource 泄漏内存?

如何从 .cs 文件加载类

在C#中调用exe程序