使用 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 编译器无法识别脚本中的父类