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

时间:2012-05-08 08:25:48

标签: c# .net-assembly

通常我们经常添加dll的引用然后访问该dll中的类并创建该类的实例。现在我在我的项目中包含一个dll文件作为嵌入资源。现在我的问题是,如何访问类并创建该类的实例,该类包含在嵌入式资源中。我搜索谷歌并找到像Embedding one dll inside another as an embedded resource and then calling it from my code

这样的stackoverflow链接

我在那里找到的用于访问dll的指令,它包含在嵌入式资源中,如

将第三方程序集作为资源嵌入后,添加代码以在应用程序启动期间订阅当前域的AppDomain.AssemblyResolve事件。只要CLR的Fusion子系统无法根据有效的探测(策略)定位组件,就会触发此事件。在AppDomain.AssemblyResolve的事件处理程序中,使用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的Fusion子系统失败了?这是什么意思? 当AssemblyResolve事件发生时。我需要将此代码放在program.cs文件中。

Assembly.Load()只会将程序集加载到内存中 他们没有展示如何在dll中创建入级实例?

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

1 个答案:

答案 0 :(得分:1)

  

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

This article详细解释(特别是探测比特(融合)部分):

  

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


  

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

Another question in SO解释了如何在动态加载的程序集中创建类型的实例。