需要使用作为嵌入资源包含在项目中的 dll

本文关键字:项目 dll 包含 嵌入资源 | 更新日期: 2023-09-27 18:33:25

通常,我们经常添加DLL的引用,然后在该DLL中访问已分类并创建该分类的实例。 现在,我已经在我的项目中包含一个DLL文件作为嵌入式资源。 现在我的问题是,我如何访问类并创建该类的实例,该实例存在于作为嵌入式资源包含的DLL中。 我搜索谷歌并发现堆栈溢出链接,例如将一个 dll 嵌入另一个 dll 作为一个嵌入的资源,然后从我的代码中调用它

我在那里找到的用于访问DLL的指令,该指令作为嵌入式资源包含在

内,例如将

第三方程序集嵌入为资源后,添加代码以在应用程序启动期间订阅当前域的 AppDomain.AssemblyResolve 事件。只要 CLR 的 Fusion 子系统无法根据有效的探测(策略(找到程序集,就会触发此事件。在 AppDomain.AssemblyReresolve 的事件处理程序中,使用 Assembly.GetManifestResourceStream 加载资源,并将其内容作为字节数组馈送到相应的 Assembly.Load 重载中。下面是一个这样的实现在 C# 中的样子:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var resName = args.Name + ".dll";    
var thisAssembly = Assembly.GetExecutingAssembly();    
using (var input = thisAssembly.GetManifestResourceStream(resName))
{
    return input != null 
         ? Assembly.Load(StreamToBytes(input))
         : null;
}
};

其中 StreamToBytes 可以定义为:

static byte[] StreamToBytes(Stream input) 
{
var capacity = input.CanSeek ? (int) input.Length : 0;
using (var output = new MemoryStream(capacity))
{
    int readLength;
    var buffer = new byte[4096];
    do
    {
        readLength = input.Read(buffer, 0, buffer.Length);
        output.Write(buffer, 0, readLength);
    }
    while (readLength != 0);
    return output.ToArray();
}
}

我很少有事情不清楚。 该人士说。

添加代码以在应用程序启动期间订阅当前域的 AppDomain.AssemblyResolve 事件。只要 CLR 的 Fusion 子系统无法根据有效的探测(策略(找到程序集,就会触发此事件。

CLR 的融合子系统失败是什么?这是什么意思?当程序集解析事件将触发时。我需要将此代码放入我的程序.cs文件中吗?

Assembly.Load(( 只会将程序集加载到内存中,但他们没有展示如何在该 DLL 中创建分类的实例?

请详细讨论我的兴趣点。 谢谢

需要使用作为嵌入资源包含在项目中的 dll

CLR 的融合子系统失败是什么?这是什么意思?

本文对此进行了详细解释(尤其是探测位(融合(部分(:

当探测无法找到程序集时,它将触发 AppDomain.AssemblyResolve 事件,允许用户代码执行其 自己的自定义加载。如果所有其他方法都失败了,则会抛出 TypeLoadException。 (如果由于引用驻留的类型而调用加载进程 在依赖程序集中(或 FileNotFoundException(如果加载 进程是手动调用的(。


Assembly.Load(( 只会将程序集加载到内存中,但他们没有 演示如何在该 DLL 中创建已分类的实例?

SO 中的另一个问题解释了如何在动态加载的程序集中创建类型的实例。