技术好文共享:简单介绍SXS的一些有意思的特性

简介: 技术好文共享:简单介绍SXS的一些有意思的特性

礼拜五某位猪仔作福,使得我有一下午空闲作一个小实验,这个实验是基于MS的一个不知名的类库,埋没了很久,没有人用很可惜。实验的内容是通过SXS把这个埋没的小草的闪光点发挥出来。在经过一段时间(准确的说是1,2个小时温习SXS,google了MS社区的几个要踢某位写SXS文章的屁股的MVP洋大人回帖后),渐渐的,渐渐的,萌发了一种冲动,这是一中很强烈的冲动,当然最后还是克制住了,现在很开心的把结果给大家展示一下(不想听我废话可以直接看几行代码)。


很多时候我们会陷入到DLL版本控制的困境中,而一套有层次的.net程序的配置布局是支持重定向你的ASSEMBLY的,但是在典型的WIN32环境,是怎么解决的呢?某人发明了winSXS,某群人实现了winSXS,其他人,比如我,已经学习了怎么使用winSXS,最后厚着脸皮来介绍怎么使用。


浅层次的说,制作一个winSXS是很容易的,比如下面这个示例。但是当环境变得复杂,当DLL变得庞大臃肿,当EXE(COM)的介入,使得winSXS的配置和调试,和测试变得异常的乏味和消磨时间。有人写了一个十分狗屎的工具谣言可以帮助你减轻烦恼,千万不要相信它,老老实实的把那段MSDN的章节看完,像品中药一样的闻一下,然后摒住呼吸,一口气咽下去...这个时候你还不能说可以做到游刃有余,但是起码可以做到兵来将挡,知道怎么去应对。


深层次的说,winSXS就像为WINDOWS的DLLs制作的狗皮膏药那样,廉价,却不失为一种可行的办法,总有需要的人和场合。它有自己的cache,集中管理你的文件的版本,有一个隐晦的规则在众多路径中定位到真正你想要的文件,然后加载。它有一个线程相关的上下文环境来支持动态的调用,比如WINDOWS的标准控件版本就是通过它来呈现出不同版本,风格的外观。


罗嗦了半天,如果你是通过google发现了这段代码,请忽略我上面这么多废话,直接看下面的代码 J


class Program


{


【DllImport("Kernel32.dll", SetLastError = true)】


private static extern IntPtr CreateActCtxW(ref ACTCTX pActCtx);


【DllImport("Kernel32.dll", SetLastError = true)】


private static extern IntPtr CreateActCtxA(ref ACTCTX pActCtx);


【DllImport("Kernel32.dll", SetLastError = true)】


【return: MarshalAs(UnmanagedType.Bool)】


private static extern bool ActivateActCtx(IntPtr hActCtx, out IntPtr lpCookie);


【StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)】


private struct ACTCTX


{


public int cbSize;


public uint dwFlags;


public string lpSource;


public ushort wProcessorArchitecture;


public Int16 wLangId;


public string lpAssemblyDirectory;


public string lpResourceName;


public string lpApplicationName;


public IntPtr hModule;


}


static void Main(string【】 args)


{


ACTCTX actctx = new ACTCTX();


actctx.cbSize = Marshal.SizeOf(actctx);


actctx.lpSource = "html2xhtml.dll";


actctx.dwFlags |= 0x008;


//代码效果参考:http://www.lyjsj.net.cn/wx/art_23977.html

actctx.lpResourceName = "#1";

IntPtr lpCookie;


var ptr = CreateActCtxW(ref actctx);


var flag = ActivateActCtx(ptr, out lpCookie);


var utilities = new XHTMLUtilities();


var txt = new WebClient().DownloadString("");


var result = utilities.convertToXHTML(txt);


}


}


下一步我会把它放到一个win32的资源中,使用memory dll的载入方式,封装成一个混血的.net DLL。我相信更多的人会去用它。

目录
打赏
0
0
0
0
0
分享
相关文章
如何用Windows性能监视器进行SMB性能监控和分析
本文介绍如何通过Windows 性能监视器(Perfmon) 使用SMB 客户端性能计数器(Performance Counters)进行性能监控和分析。
3470 0
机器学习框架教程:介绍一些流行的机器学习框架(如Scikit-learn、XGBoost等)
机器学习框架教程:介绍一些流行的机器学习框架(如Scikit-learn、XGBoost等)
1319 0
阿里云gpu云服务器最新收费标准与优惠价格表
租用阿里云gpu云服务器需要多少钱?不同时期阿里云服务器的租用价格不同,目前阿里云官方活动中主打的gpu云服务器是计算型gn6v、gn7i和gn6i云服务器,购买时长为1个月、6个月和1年自选,其中配置最低的计算型gn6i实例4核15G月付只要3368.00元/1个月起,年付为34221.00元/1年起,配置最高的计算型gn6i实例96核372G月付为19820.00元/1个月起,年付202164.00元/1年起。本文主要为大家介绍目前阿里云gpu云服务器最新收费标准与优惠价格表,以供大家参考和选择。
1188 0
阿里云gpu云服务器最新收费标准与优惠价格表
第三方数据平台
本文研究全球及中国市场第三方数据平台现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美、欧洲、中国、日本、东南亚和印度等地区的现状及未来发展趋势
AI技术在医疗领域的应用与未来展望###
本文深入探讨了人工智能(AI)技术在医疗领域的多种应用及其带来的革命性变化,从疾病诊断、治疗方案优化到患者管理等方面进行了详细阐述。通过具体案例和数据分析,展示了AI如何提高医疗服务效率、降低成本并改善患者体验。同时,文章也讨论了AI技术在医疗领域面临的挑战和未来发展趋势,为行业从业者和研究人员提供参考。 ###
【内含干货PPT下载】DTCC 2020 | 阿里云吉剑南:在线分析进入Fast Data时代的关键技术解读
如今,对于在线分析技术而言,正在从“Big Data”时代向着“Fast Data”时代迈进,所面对的技术和市场环境发生了巨大变化,与此同时也需要面对全新的挑战。在第十一届中国数据库技术大会(DTCC2020)上,阿里云数据库高级技术专家吉剑南为大家带来了在线分析进入Fast Data时代的个关键技术解读。
4755 0
【内含干货PPT下载】DTCC 2020 | 阿里云吉剑南:在线分析进入Fast Data时代的关键技术解读
ECS更换公网ip
购买阿里云服务器后,有时候由于业务需求变更,或者当前的公网IP地址出现了局部访问异常的情况,我们需要更换服务器的公网IP地址。 本文介绍了ECS公网IP地址的两种更换方法,以及新增公网地址的方法。
4378 1
JavaScript 实现大文件上传的方法
【10月更文挑战第17天】通过以上步骤和方法,我们可以实现较为可靠和高效的大文件上传功能。当然,具体的实现方式还需要根据实际的应用场景和服务器要求进行调整和优化。
按量付费转包年包月之批量操作篇
阿里云 ECS 实例按实例付费类型分为两种:即 按量(后付费)实例 和 包年包月(预付费)实例,按量实例又被分为 普通按量实例 和 [竞价实例](https://help.aliyun.com/document_detail/52088.html) 两种,本文将介绍如何批量地将 普通按量实例 转换为 包年包月实例。
5448 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等