DLL文件包含PNG资源类型中的一些图像。
我可以在Resource Hacker,Anolis Resourcer& Sons等软件中查看PNG图像。资源调谐器。查看Anolis Resourcer的屏幕截图,了解更多详情:
http://i51.tinypic.com/9pt93c.jpg
有人可以告诉我如何获取PNG图像。从DLL文件5220并将其放在PictureBox中?我不认为像LoadImage或LoadBitmap这样的API会起作用。
答案 0 :(得分:6)
// get the assembly containing the image
var assembly = Assembly.GetExecutingAssembly();
// set the picturebox image to read the embedded resource
pictureBox1.Image = Image.FromStream(
assembly.GetManifestResourceStream("AssemblyName.test.png")
);
其中AssemblyName.test.png
是程序集内嵌入资源的完全限定名称。
更新:
您似乎正在尝试从本机程序集中提取资源。您可以查看following article,其中说明了如何使用P / Invoke完成此操作。
答案 1 :(得分:4)
Darin发布的链接(因此被标记为答案)不包含功能代码。我已经评估了那里发布的代码(http://khason.net/blog/how-to-load-unmanaged-native-resources-from-managed-c-code/),发现它无法正常运行嵌入在任何win32 dll中的位图图像作为位图资源。
此外,汉斯·帕斯特(Hans Passant)放弃了无数的步骤,有效地使他的职位无用。
我能找到的唯一有点接近的解决方案来自于2004年为XP Theme dll垃圾编写的一篇文章。您可以在ThemeManager.cs http://www.codeproject.com/KB/miscctrl/XPTaskBar.aspx
中找到'GetResourcePNG'方法但是,应该注意的是,我对这个方法一直有很多困难,因为调用了bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);在我的系统上尝试访问authui.dll中的png时导致内存问题
<强>更新强>
我发现此处列出的代码(http://www.vbaccelerator.com/home/NET/Code/Controls/Explorer_Bar/ExplorerBar_Control_Source_Code.asp)是迄今为止最具功能性的代码,产生最少的错误并产生最快的结果。代码用c#编写,即使域名另有说明。使用这两个类; ImageUtility和ResourceLibrary,您可以轻松地将PNG从标准的非.NET资源库/ dll中拉出来:
public static Bitmap GetStandardResourceBitmap(String dllName, String resourceId) {
Bitmap result = null;
using (ResourceLibrary library = new ResourceLibrary() { Filename = dllName }) {
IntPtr hDib = library.GetResource(resourceId, ResourceLibrary.ImageType.IMAGE_BITMAP, ResourceLibrary.ImageLoadOptions.LR_CREATEDIBSECTION);
if (!hDib.Equals(IntPtr.Zero)) {
result = ImageUtility.DibToBitmap(hDib);
ImageUtility.DeleteObject(hDib);
}
}
return result;
}
我选择在我的方法中使用一个String的resourceId,只是因为它不需要重载并且使用编号资源Ids就像在前面添加'#'一样简单。
GetStandardResourceBitmap("shell32.dll", "#632");
干杯
答案 2 :(得分:3)
PNG图像不是标准的Win32资源类型之一。它通常作为二进制blob嵌入,命名资源类型为“PNG”,但不保证。到目前为止,最简单的方法是使用Visual Studio的File + Open + File命令打开文件。找回资源,右键单击它,然后选择Export将其保存到磁盘。
以编程方式执行此操作需要很多坚韧不拔的pinvoke。这很棘手,因为资源类型和资源ID都可以是字符串或IntPtr,因此FindResource需要4次重载。按顺序,您需要LoadLibraryEx()来加载文件而不执行任何代码。 FindResource获取资源的句柄。 SizeOfResource知道它有多大。 LoadResource + LockResource获取指向资源数据的指针。 Marshal.Copy()将资源数据复制到byte []中。使用FreeResource和FreeLibrary进行清理。