SharpDevelop资源管理与访问问题求助
我之前在SharpDevelop里折腾过好一阵子资源访问的问题,太懂这种VS和SD语法不兼容的头疼了!给你整理了亲测有效的解决方案和代码示例,分两种情况说:
SharpDevelop不会像VS那样自动生成Properties.Resources静态类,所以得手动用ResourceManager来读取资源,步骤如下:
先确认RESX文件的设置
选中你的RESX文件(比如Resources.resx)右键→属性,把生成操作改成嵌入的资源,自定义工具留空(别选VS专属的ResXFileCodeGenerator)。代码示例:读取不同类型资源
假设你的项目命名空间是MyWinFormsApp,RESX在项目根目录:using System.Resources; using System.Reflection; using System.Drawing; using System.Media; // 初始化资源管理器,参数格式为「命名空间.RESX文件名」 var resManager = new ResourceManager("MyWinFormsApp.Resources", Assembly.GetExecutingAssembly()); // 将内嵌图片设置到PictureBox(替换为你的资源名) var sampleImg = (Bitmap)resManager.GetObject("SampleIMG"); pictureBox1.Image = sampleImg; // 播放内嵌音效 var soundStream = (UnmanagedMemoryStream)resManager.GetStream("BackgroundSound"); var soundPlayer = new SoundPlayer(soundStream); soundPlayer.Play(); // 获取自定义字符串资源 var customText = resManager.GetString("CustomText");如果RESX放在子文件夹(比如
Resources文件夹),资源名称要改成MyWinFormsApp.Resources.Resources(命名空间+文件夹名+RESX文件名)。
首先得确保DLL里的资源文件(或RESX)的生成操作也是嵌入的资源,然后通过DLL的程序集来获取资源:
用RESX管理的DLL资源:播放背景音效
假设DLL命名空间是MyResourceDLL,RESX文件是DLLResources.resx,放在Resources文件夹下:using System.Resources; using System.Reflection; using System.Media; // 获取DLL的程序集(如果已引用DLL,也可以用typeof(MyResourceDLL.任意类).Assembly) Assembly dllAssembly = Assembly.Load("MyResourceDLL"); // 初始化DLL的资源管理器 var dllResManager = new ResourceManager("MyResourceDLL.Resources.DLLResources", dllAssembly); // 循环播放背景音效 var musicStream = (UnmanagedMemoryStream)dllResManager.GetStream("BackgroundMusic"); SoundPlayer musicPlayer = new SoundPlayer(musicStream); musicPlayer.PlayLooping();直接嵌入的DLL资源(无需RESX):读取图片
要是DLL里直接把Images/SamplePic.png设为嵌入资源,不用RESX,可以直接读取流:using System.Reflection; using System.Drawing; Assembly dllAssembly = Assembly.Load("MyResourceDLL"); // 资源名称格式:命名空间.文件夹名.文件名(路径分隔符替换为点) Stream imgStream = dllAssembly.GetManifestResourceStream("MyResourceDLL.Images.SamplePic.png"); Bitmap dllImg = new Bitmap(imgStream); pictureBox1.Image = dllImg;
你可以根据自己的项目命名空间、资源路径调整代码,我在SharpDevelop 5.0里亲测这些代码都能正常运行。
内容的提问来源于stack exchange,提问作者AndrewSDT

