首页 / C# / c#-MEF-从嵌入式DLL获取程序集
c#-MEF-从嵌入式DLL获取程序集
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-MEF-从嵌入式DLL获取程序集,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3198字,纯文字阅读大概需要5分钟。
内容图文
![c#-MEF-从嵌入式DLL获取程序集](/upload/InfoBanner/zyjiaocheng/684/bc10f451f38d4c828bb4521b08a783bf.jpg)
我正在使用MEF为WPF应用程序创建“插件”.我想将其中一些插件直接嵌入EXE文件,因为EXE需要独立.我正在使用Fody的Costura来嵌入资源以及所有其他参考.由于exe文件需要独立,因此我无法为这些插件创建目录并使用DirectoyCatalog
无论如何,我可以从嵌入式资源中加载程序集,也可以简单地指定程序集名称,例如:
catalog.Catalogs.Add(new AssemblyCatalog("My.Assembly.Name));
我尝试遍历清单资源,但是这些似乎被Fody压缩了:
var resourceNames = GetType().Assembly.GetManifestResourceNames();
foreach (var resourceName in resourceNames)
任何帮助/建议表示赞赏.
解决方法:
好的,因此使用下面的类为我工作(在https://github.com/Sebazzz/EntityProfiler/blob/master/src/UI/EntityProfiler.Viewer/AppBootstrapper.cs找到此代码,并进行调整以满足我的需要):
要使用它,您只需调用提取函数,该函数将在资源清单中找到所有Costura Zip文件并解压缩并注册.
该函数返回与该函数中传递的字符串匹配的所有程序集的字典.然后,我遍历它们,并将其添加到组合容器要使用的目录中:
var assemblies = CosturaAssemblyExtractor.Extract(AppDomain.CurrentDomain, Assembly.GetExecutingAssembly(), "My.AssemblyName");
foreach (var assembly in assemblies)
{
catalog.Catalogs.Add(new AssemblyCatalog(assembly.Value));
}
container = new CompositionContainer(catalog);
类:
public static class CosturaAssemblyExtractor
{
public static Dictionary<string, Assembly> Extract(AppDomain OrigDomain, Assembly ExecutingAssembly, string AssemblyStartsWith)
{
//var currentDomain = origDomain;
var assemblies = OrigDomain.GetAssemblies();
var references = new Dictionary<string, Assembly>();
var manifestResourceNames = ExecutingAssembly.GetManifestResourceNames().Where(x => {
return x.ToUpper().StartsWith(("costura." + AssemblyStartsWith).ToUpper()) && x.ToUpper().EndsWith(".dll.zip".ToUpper());
});
foreach (var resourceName in manifestResourceNames)
{
var solved = false;
foreach (var assembly in assemblies)
{
var refName = string.Format("costura.{0}.dll.zip", GetDllName(assembly, true));
if (resourceName.Equals(refName, StringComparison.OrdinalIgnoreCase))
{
references[assembly.FullName] = assembly;
solved = true;
break;
}
}
if (solved)
continue;
using (var resourceStream = ExecutingAssembly.GetManifestResourceStream(resourceName))
{
if (resourceStream == null) continue;
if (resourceName.EndsWith(".dll.zip"))
{
using (var compressStream = new DeflateStream(resourceStream, CompressionMode.Decompress))
{
var memStream = new MemoryStream();
CopyTo(compressStream, memStream);
memStream.Position = 0;
var rawAssembly = new byte[memStream.Length];
memStream.Read(rawAssembly, 0, rawAssembly.Length);
var reference = Assembly.Load(rawAssembly);
references[reference.FullName] = reference;
}
}
else
{
var rawAssembly = new byte[resourceStream.Length];
resourceStream.Read(rawAssembly, 0, rawAssembly.Length);
var reference = Assembly.Load(rawAssembly);
references[reference.FullName] = reference;
}
}
}
return references;
}
private static void CopyTo(Stream source, Stream destination)
{
var array = new byte[81920];
int count;
while ((count = source.Read(array, 0, array.Length)) != 0)
{
destination.Write(array, 0, count);
}
}
private static string GetDllName(Assembly assembly, bool withoutExtension = false)
{
var assemblyPath = assembly.CodeBase;
return withoutExtension ? Path.GetFileNameWithoutExtension(assemblyPath) : Path.GetFileName(assemblyPath);
}
}
内容总结
以上是互联网集市为您收集整理的c#-MEF-从嵌入式DLL获取程序集全部内容,希望文章能够帮你解决c#-MEF-从嵌入式DLL获取程序集所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。