C# 需要使用dll,该dll作为嵌入资源包含在项目中

C# 需要使用dll,该dll作为嵌入资源包含在项目中,c#,.net-assembly,C#,.net Assembly,通常我们会添加dll的引用,然后访问dll中的类,并创建该类的实例。现在我已经在我的项目中包含了一个dll文件作为嵌入资源。现在我的问题是,如何访问类并创建类的实例,这些类位于作为嵌入资源包含的dll中。我在谷歌上搜索发现stackoverflow链接 我在那里找到的用于访问dll的指令,该指令作为嵌入资源包含,如 将第三方程序集作为资源嵌入后,添加代码以在应用程序启动期间订阅当前域的AppDomain.AssemblyResolve事件。每当CLR的Fusion子系统未能根据有效的探测(策略)

通常我们会添加dll的引用,然后访问dll中的类,并创建该类的实例。现在我已经在我的项目中包含了一个dll文件作为嵌入资源。现在我的问题是,如何访问类并创建类的实例,这些类位于作为嵌入资源包含的dll中。我在谷歌上搜索发现stackoverflow链接

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

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

其中,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的融合子系统故障?这是什么意思? 当AssemblyResolve事件将激发时。我是否需要将此代码放入program.cs文件中

Load()将只将程序集加载到内存中,但 他们没有展示如何在dll中创建classed的实例

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

什么是CLR的融合子系统故障?这是什么意思

详细说明(尤其是位的部分探测(融合)):

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


Assembly.Load()将只将程序集加载到内存中,但它们没有加载 演示如何在该dll中创建classed的实例

解释如何在动态加载的程序集中创建类型的实例

什么是CLR的融合子系统故障?这是什么意思

详细说明(尤其是位的部分探测(融合)):

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


Assembly.Load()将只将程序集加载到内存中,但它们没有加载 演示如何在该dll中创建classed的实例

解释如何在动态加载的程序集中创建类型的实例

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();
}
}