通常我们经常添加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中创建入级实例?
请详细讨论我的兴趣点。感谢
答案 0 :(得分:1)
什么是CLR的Fusion子系统失败?这是什么意思?
This article详细解释(特别是探测比特(融合)部分):
当探测无法找到装配时,它将触发 AppDomain.AssemblyResolve事件,允许用户代码执行它 自定义加载。如果所有其他方法都失败,则抛出TypeLoadException (如果由于引用类型驻留而调用了加载过程 在依赖程序集中)或FileNotFoundException(如果加载 手动调用过程。)
Assembly.Load()只会将程序集加载到内存中,但它们没有 展示如何在该dll中创建入级实例?
Another question in SO解释了如何在动态加载的程序集中创建类型的实例。