C# 在DLL文件中嵌入文件、图片并读取内容

C# 在DLL文件中嵌入文件、图片并读取内容

一.首先新建一个文本文件TestFile.txt,如下图:
在这里插入图片描述
二.在Visual Studio中添加一个类库MyClassLibrary,然后右击->属性->资源->此项目不包含默认的资源文件,单击此处可创建一个->添加现有文件,选择之前创建的TestFile.txt,如下图:
在这里插入图片描述
三.在类库中添加获取文本内容的代码,可在类库中默认的Class1中添加代码如下,然后点击重新生成,即可生成dll文件;

namespace MyClassLibrary
{
    public class Class1
    {
        public string GetTextFromResource()
        {
            return Properties.Resources.TestFile;	//TestFile就是文件名
        }
    }
}

四.然后可以添加一个WinForm程序进行测试,把刚才的DLL文件引用进来,读取txt内容的代码如下:

MyClassLibrary.Class1 fileMsg = new MyClassLibrary.Class1();
string str = fileMsg.GetTextFromResource();
richTextBox1.Text = str;

运行效果:
在这里插入图片描述

注意:可以使用同样的方法添加图片资源,例如:

namespace ClassLibrary1
{
    public class Class1
    {
        public Bitmap GetPicture()
        {
            return Properties.Resources.A8;	//A8是一张jpg图片
        }
    }
}

也可以用下面的方式来读取DLL中的资源;

Assembly myAssembly = System.Reflection.Assembly.Load("ClassLibrary1");
System.Resources.ResourceManager myManager = new System.Resources.ResourceManager("ClassLibrary1.Properties.Resources", myAssembly);
System.Drawing.Image myImage = (System.Drawing.Image)myManager.GetObject("A8"); 

还可以这样读DLL中资源:

//Assembly assm = this.GetType().Assembly;//Assembly.LoadFrom(程序集路径);
Assembly assm = System.Reflection.Assembly.Load("ClassLibrary1");
foreach (string resName in assm.GetManifestResourceNames())
{
     Stream stream = assm.GetManifestResourceStream(resName);
     ResourceReader rr = new ResourceReader(stream);
     IDictionaryEnumerator enumerator = rr.GetEnumerator();
     while (enumerator.MoveNext())
     {
          DictionaryEntry de = (DictionaryEntry)enumerator.Current;
          //de.Key是资源名
          //de.Value是资源内容
      }
}
C#嵌入DLL并调用其的函数,可以使用DllImport属性和LoadLibrary函数。 以下是实现的步骤: 1. 创建一个C#项目, 添加一个,并引入System.Runtime.InteropServices命名空间。 2. 使用DllImport属性声明要调用的DLL和其的函数。例如: ```csharp [DllImport("user32.dll")] public static extern int MessageBox(IntPtr hWnd, string text, string caption, int options); ``` 3. 在代码使用该函数。例如: ```csharp MessageBox(IntPtr.Zero, "Hello World!", "Greeting", 0); ``` 4. 如果要嵌入DLL,可以使用LoadLibrary函数加载DLL,并获取其的函数地址。例如: ```csharp IntPtr handle = LoadLibrary("mydll.dll"); IntPtr funcPtr = GetProcAddress(handle, "myfunc"); ``` 5. 然后可以使用Marshal.GetDelegateForFunctionPointer方法将函数地址转换为委托型,并使用该委托调用函数。 完整代码示例: ```csharp using System; using System.Runtime.InteropServices; class Program { [DllImport("user32.dll")] public static extern int MessageBox(IntPtr hWnd, string text, string caption, int options); [DllImport("mydll.dll")] public static extern int myfunc(int arg); [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string path); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr handle, string symbol); static void Main() { MessageBox(IntPtr.Zero, "Hello World!", "Greeting", 0); IntPtr handle = LoadLibrary("mydll.dll"); IntPtr funcPtr = GetProcAddress(handle, "myfunc"); var myFunc = Marshal.GetDelegateForFunctionPointer<myfuncDelegate>(funcPtr); int result = myFunc(42); Console.WriteLine($"Result: {result}"); } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate int myfuncDelegate(int arg); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值