gpt4 book ai didi

c# - 使用嵌入式 DLL?

转载 作者:行者123 更新时间:2023-11-30 14:43:31 25 4
gpt4 key购买 nike

是否有关于如何在 c# 源代码中使用资源嵌入式 dll 的详细指南?我在 Google 上找到的所有指南似乎都没有太大帮助。都是“创建一个新类”或“ILMerge”这个和“.NETZ”那个。但是我不确定如何使用 ILMerge 和 .NETZ 的东西,并且类指南遗漏了制作类文件后要做什么,因为这样做之后我没有发现任何新内容。例如,this .添加类和函数后,我不知道如何从我的资源中获取 dll。

所以,具体来说,我正在寻找的是关于如何使用 嵌入到资源 中的 .dll 文件的指南,以便能够调用一个 class,没有和部分遗漏。请记住,我对 C# 编码不是很有经验。提前致谢。 :D

附言。尽量不要使用那些大词。我很容易迷路。

最佳答案

您可以使用 Stream 获取 DLL 的 Assembly.GetManifestResourceStream ,但是为了对其进行任何操作,您需要将其加载到内存中并调用 Assembly.Load ,或者将其提取到文件系统(然后很可能 仍然调用 Assembly.Load Assembly.LoadFile ,除非你实际上已经对它产生了依赖。

加载程序集后,您必须使用反射来创建类的实例或调用方法等。所有这些都非常繁琐 - 特别是我永远不记得调用 Assembly.Load 的各种重载的情况(或类似的方法)。 Jeff Richter 的 "CLR via C#" 书将是您​​办公 table 上的有用资源。

您能否提供更多信息说明为什么需要这样做?我已经将 list 资源用于各种用途,但从未包含代码……有什么理由不能将它与可执行文件一起发送吗?

这是一个完整的例子,尽管没有错误检查:

// DemoLib.cs - we'll build this into a DLL and embed it
using System;

namespace DemoLib
{
public class Demo
{
private readonly string name;

public Demo(string name)
{
this.name = name;
}

public void SayHello()
{
Console.WriteLine("Hello, my name is {0}", name);
}
}
}

// DemoExe.cs - we'll build this as the executable
using System;
using System.Reflection;
using System.IO;

public class DemoExe
{
static void Main()
{
byte[] data;
using (Stream stream = typeof(DemoExe).Assembly
.GetManifestResourceStream("DemoLib.dll"))
{
data = ReadFully(stream);
}

// Load the assembly
Assembly asm = Assembly.Load(data);

// Find the type within the assembly
Type type = asm.GetType("DemoLib.Demo");

// Find and invoke the relevant constructor
ConstructorInfo ctor = type.GetConstructor(new Type[]{typeof(string)});
object instance = ctor.Invoke(new object[] { "Jon" });

// Find and invoke the relevant method
MethodInfo method = type.GetMethod("SayHello");
method.Invoke(instance, null);
}

static byte[] ReadFully(Stream stream)
{
byte[] buffer = new byte[8192];
using (MemoryStream ms = new MemoryStream())
{
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}
return ms.ToArray();
}
}
}

构建代码:

> csc /target:library DemoLib.cs
> csc DemoExe.cs /resource:DemoLib.dll

关于c# - 使用嵌入式 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com