-
读写资源文件
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
![](/Images/OutliningIndicators/None.gif)
using System.Resources;
using ResEditorComponents ;
![](/Images/OutliningIndicators/None.gif)
namespace 读写资源文件
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.Button button5;
private System.Windows.Forms.PictureBox pictureBox1;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
![](/Images/OutliningIndicators/InBlock.gif)
public Form1()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
![](/Images/OutliningIndicators/InBlock.gif)
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if( disposing )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (components != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.button5 = new System.Windows.Forms.Button();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(296, 48);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(144, 23);
this.button1.TabIndex = 0;
this.button1.Text = "写资源文件(字符串)";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(296, 88);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(144, 23);
this.button2.TabIndex = 0;
this.button2.Text = "写资源文件(图像)";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(224, 128);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(208, 23);
this.button3.TabIndex = 1;
this.button3.Text = "系统所带的资源文件操作源码";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// button4
//
this.button4.Location = new System.Drawing.Point(296, 168);
this.button4.Name = "button4";
this.button4.TabIndex = 2;
this.button4.Text = "button4";
//
// button5
//
this.button5.Location = new System.Drawing.Point(256, 208);
this.button5.Name = "button5";
this.button5.Size = new System.Drawing.Size(192, 32);
this.button5.TabIndex = 3;
this.button5.Text = "button5";
this.button5.Click += new System.EventHandler(this.button5_Click);
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(16, 24);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(200, 176);
this.pictureBox1.TabIndex = 4;
this.pictureBox1.TabStop = false;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(520, 266);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.button5);
this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.button1);
this.Controls.Add(this.button2);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
![](/Images/OutliningIndicators/InBlock.gif)
}
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Application.Run(new Form1());
}
![](/Images/OutliningIndicators/InBlock.gif)
//将字符串写入资源文件
private void button1_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Creates a resource writer.
![](/Images/OutliningIndicators/InBlock.gif)
IResourceWriter writer = new ResourceWriter("myString.resources");
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
// Adds resources to the resource writer.
![](/Images/OutliningIndicators/InBlock.gif)
writer.AddResource("ID", "0001");
![](/Images/OutliningIndicators/InBlock.gif)
writer.AddResource("NAME", "FURENJUN");
![](/Images/OutliningIndicators/InBlock.gif)
writer.AddResource("AGE", "22");
![](/Images/OutliningIndicators/InBlock.gif)
// Writes the resources to the file or stream, and closes it.
![](/Images/OutliningIndicators/InBlock.gif)
writer.Close();
MessageBox.Show("success") ;
}
![](/Images/OutliningIndicators/InBlock.gif)
private void Form1_Load(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button2_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// Creates a resource writer.
![](/Images/OutliningIndicators/InBlock.gif)
ResourceWriter rw = new ResourceWriter (Application.StartupPath +@"\picture.resources" );
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//从指定的文件创建Image对象.
OpenFileDialog openFileDialog1 = new OpenFileDialog();
![](/Images/OutliningIndicators/InBlock.gif)
openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "图像文件 (*.jpg)|*.jpg|All files (*.*)|*.*" ;
openFileDialog1.FilterIndex = 1 ;
openFileDialog1.RestoreDirectory = true ;
openFileDialog1.Multiselect =true;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
string[] fileName1= openFileDialog1.FileNames;
int i=fileName1.Length ;
for(int j=0;j<i;j++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//把Image对象添加到资源文件中
//ResourceWritername.AddResource(string name, object value);
//其中name为资源名,value为资源值
string ImageName="Img" + j.ToString();
Image Img=Image.FromFile (fileName1[j]);
rw.AddResource ( ImageName , Img );
![](/Images/OutliningIndicators/InBlock.gif)
}
}
// Writes the resources to the file or stream, and closes it.
![](/Images/OutliningIndicators/InBlock.gif)
rw.Generate ();
![](/Images/OutliningIndicators/InBlock.gif)
rw.Close ();
MessageBox.Show("success") ;
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button3_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ResEditor redit=new ResEditor();
redit.Show();
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button5_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//初始化 ResourceManager 类的新实例,它查找包含在一些文件中的资源,
//这些文件是使用给定的 Assembly 从指定根名称导出的。
//格式
// public ResourceManager(
// string baseName,
// Assembly assembly
//);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//读取资源文件
ResourceManager rm;
//rm = new ResourceManager("读写资源文件.picture", this.GetType().Assembly); //应用(2.1)写法
rm = new ResourceManager("读写资源文件.image.picture", this.GetType().Assembly); //应用(2.2)写法
this.pictureBox1.Image = (System.Drawing.Image)rm.GetObject("Img0");
rm = new ResourceManager("读写资源文件.myString", this.GetType().Assembly);
MessageBox.Show(rm.GetObject("ID").ToString() ) ;
//备注:
//1.一定要将生成的资源文件添加到当前项目中,并将其设为"嵌入的资源".
//2.如果你资源文件在debug文件夹下,
// (2.1) (资源的根名称)baseName格式为:<default namespace.><filename>
// 如果资源的文件在该项目的子文件夹中,
// (2.2) baseName格式为:<default namespace.><child folder name.><filename>
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
//系统所带资源文件编辑工具源代码
//D:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Tutorials\resourcesandlocalization\reseditor
//Environment.GetCommandLineArgs()
![](/Images/OutliningIndicators/InBlock.gif)
//只有 .resources 文件才应嵌入在公共语言运行库程序集和附属程序集中。
//资源文件生成器 (Resgen.exe) 将文本 (.txt) 文件和基于 XML 的资源 (.resx) 文件转换成
//.resources 文件,方法是包装由 ResourceReader、ResourceWriter、ResXResourceReader
//和 ResXResourceWriter 类实现的方法。您还可以使用 Resgen.exe 来将 .resources 文件
//转换回 .resx 和 .txt 文件。
![](/Images/OutliningIndicators/InBlock.gif)
//D:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Tutorials\resourcesandlocalization\resxgen
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/None.gif)
//读取.exe文件中的图片,并将其保存下来
![](/Images/OutliningIndicators/None.gif)
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Reflection;
using System.IO;
![](/Images/OutliningIndicators/None.gif)
namespace EmbeddedResources1
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Summary description for Form1.
/// </summary>
public class MainForm : System.Windows.Forms.Form
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private Assembly loadedAssembly = null;
![](/Images/OutliningIndicators/InBlock.gif)
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button loadAssembly;
private System.Windows.Forms.ListBox resources;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.PictureBox image;
private System.Windows.Forms.Splitter splitter;
private System.Windows.Forms.Button save;
private System.Windows.Forms.OpenFileDialog ofd;
private System.Windows.Forms.SaveFileDialog sfd;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
![](/Images/OutliningIndicators/InBlock.gif)
public MainForm()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
![](/Images/OutliningIndicators/InBlock.gif)
//
// TODO: Add any constructor code after InitializeComponent call
//
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if( disposing )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (components != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Windows Form Designer generated code#region Windows Form Designer generated code
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.panel1 = new System.Windows.Forms.Panel();
this.save = new System.Windows.Forms.Button();
this.loadAssembly = new System.Windows.Forms.Button();
this.resources = new System.Windows.Forms.ListBox();
this.splitter = new System.Windows.Forms.Splitter();
this.panel2 = new System.Windows.Forms.Panel();
this.image = new System.Windows.Forms.PictureBox();
this.ofd = new System.Windows.Forms.OpenFileDialog();
this.sfd = new System.Windows.Forms.SaveFileDialog();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
this.panel1.Controls.AddRange(new System.Windows.Forms.Control[]
{
this.save,
this.loadAssembly});
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(472, 40);
this.panel1.TabIndex = 3;
//
// save
//
this.save.Location = new System.Drawing.Point(120, 8);
this.save.Name = "save";
this.save.Size = new System.Drawing.Size(80, 23);
this.save.TabIndex = 2;
this.save.Text = "Save to file
";
this.save.Click += new System.EventHandler(this.save_Click);
//
// loadAssembly
//
this.loadAssembly.Location = new System.Drawing.Point(8, 8);
this.loadAssembly.Name = "loadAssembly";
this.loadAssembly.Size = new System.Drawing.Size(104, 23);
this.loadAssembly.TabIndex = 0;
this.loadAssembly.Text = "Load Assembly
";
this.loadAssembly.Click += new System.EventHandler(this.loadAssembly_Click);
//
// resources
//
this.resources.Dock = System.Windows.Forms.DockStyle.Left;
this.resources.IntegralHeight = false;
this.resources.Location = new System.Drawing.Point(0, 40);
this.resources.Name = "resources";
this.resources.Size = new System.Drawing.Size(128, 323);
this.resources.Sorted = true;
this.resources.TabIndex = 4;
this.resources.SelectedIndexChanged += new System.EventHandler(this.resources_SelectedIndexChanged);
//
// splitter
//
this.splitter.BackColor = System.Drawing.SystemColors.ControlDark;
this.splitter.Location = new System.Drawing.Point(128, 40);
this.splitter.MinExtra = 205;
this.splitter.MinSize = 128;
this.splitter.Name = "splitter";
this.splitter.Size = new System.Drawing.Size(3, 323);
this.splitter.TabIndex = 5;
this.splitter.TabStop = false;
//
// panel2
//
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
this.panel2.Controls.AddRange(new System.Windows.Forms.Control[]
{
this.image});
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(131, 40);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(341, 323);
this.panel2.TabIndex = 6;
//
// image
//
this.image.Dock = System.Windows.Forms.DockStyle.Fill;
this.image.Name = "image";
this.image.Size = new System.Drawing.Size(341, 323);
this.image.TabIndex = 1;
this.image.TabStop = false;
//
// ofd
//
this.ofd.DefaultExt = "dll";
this.ofd.Filter = ".NET Assemblies (*.dll;*.exe)|*.dll;*.exe|All Files (*.*)|*.*";
this.ofd.Title = "Load an assembly";
//
// sfd
//
this.sfd.Filter = "All Files (*.*)|*.*";
this.sfd.Title = "Save Resource As";
//
// MainForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(472, 363);
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
this.Controls.AddRange(new System.Windows.Forms.Control[]
{
this.panel2,
this.splitter,
this.resources,
this.panel1});
this.MinimumSize = new System.Drawing.Size(320, 240);
this.Name = "MainForm";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
this.Text = "Embedded Resource Viewer";
this.panel1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.ResumeLayout(false);
![](/Images/OutliningIndicators/InBlock.gif)
}
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Application.Run(new MainForm());
}
![](/Images/OutliningIndicators/InBlock.gif)
private void loadAssembly_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ofd.FileName = "";
![](/Images/OutliningIndicators/InBlock.gif)
if( ofd.ShowDialog() == DialogResult.Cancel )
return;
![](/Images/OutliningIndicators/InBlock.gif)
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
loadedAssembly = Assembly.LoadFrom(ofd.FileName);
}
catch(Exception ex)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
MessageBox.Show(ex.Message);
return ;
}
![](/Images/OutliningIndicators/InBlock.gif)
LoadResources();
}
![](/Images/OutliningIndicators/InBlock.gif)
private void LoadResources()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string [] resourceNames = loadedAssembly.GetManifestResourceNames();
![](/Images/OutliningIndicators/InBlock.gif)
resources.Items.Clear();
![](/Images/OutliningIndicators/InBlock.gif)
if( resourceNames.Length > 0 )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
resources.BeginUpdate();
![](/Images/OutliningIndicators/InBlock.gif)
foreach(string resourceName in resourceNames)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
resources.Items.Add(resourceName);
}
resources.EndUpdate();
}
![](/Images/OutliningIndicators/InBlock.gif)
Image img = image.Image;
![](/Images/OutliningIndicators/InBlock.gif)
image.Image = null;
![](/Images/OutliningIndicators/InBlock.gif)
if( img != null )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.Dispose();
img = null;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
private void save_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if( resources.SelectedIndex < 0 )
return ;
![](/Images/OutliningIndicators/InBlock.gif)
sfd.FileName = (string) resources.SelectedItem;
![](/Images/OutliningIndicators/InBlock.gif)
if( sfd.ShowDialog() == DialogResult.Cancel )
return ;
![](/Images/OutliningIndicators/InBlock.gif)
Stream outFile = sfd.OpenFile();
Stream inFile = loadedAssembly.GetManifestResourceStream((string) resources.SelectedItem);
![](/Images/OutliningIndicators/InBlock.gif)
long length = inFile.Length;
![](/Images/OutliningIndicators/InBlock.gif)
if( length > int.MaxValue )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
MessageBox.Show("Unable to write file in this version, sorry");
outFile.Close();
inFile.Close();
}
![](/Images/OutliningIndicators/InBlock.gif)
byte [] bytes = new byte[length];
![](/Images/OutliningIndicators/InBlock.gif)
inFile.Read( bytes, 0, (int) length );
outFile.Write( bytes, 0, (int) length );
![](/Images/OutliningIndicators/InBlock.gif)
inFile.Close();
outFile.Close();
}
![](/Images/OutliningIndicators/InBlock.gif)
private void resources_SelectedIndexChanged(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if( resources.SelectedIndex < 0 )
return ;
![](/Images/OutliningIndicators/InBlock.gif)
Stream stream = null;
![](/Images/OutliningIndicators/InBlock.gif)
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
stream = loadedAssembly.GetManifestResourceStream((string) resources.SelectedItem);
![](/Images/OutliningIndicators/InBlock.gif)
Image img = Image.FromStream(stream);
Image oldImage = image.Image;
![](/Images/OutliningIndicators/InBlock.gif)
image.Image = img;
![](/Images/OutliningIndicators/InBlock.gif)
if( oldImage != null )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
oldImage.Dispose();
oldImage = null;
}
}
catch
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
finally
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if( stream != null )
stream.Close();
}
}
}
}
![](/Images/OutliningIndicators/None.gif)
-
相关阅读:
Gym-101128D:Dice Cup
C++内联汇编,输出人物名字
钩子
列表控件ListBox关联的MFC中的类:CListBox
高级列表控件ListCtrl关联的MFC中的类:CListCtrl
菜单复选及窗口置顶
MFC学习之EDIT控件初始化
dbgprint_Mine 调试输出
64位内联汇编
win7下提权代码
-
原文地址:https://www.cnblogs.com/furenjun/p/389631.html
Copyright © 2020-2023
润新知