技术好文共享:简单介绍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
分享
相关文章
技术好文共享:运筹学之重点总结
技术好文共享:运筹学之重点总结
69 0
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
1538 159
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
149 1
【揭秘终极利器】AgileEAS.NET:服务定位器模式的魔法,如何让企业级软件开发瞬间提速?揭秘背后的技术奥秘与实战指南!
【8月更文挑战第16天】AgileEAS.NET是基于DotNet的企业级敏捷开发平台,其服务定位器模式助力构建高度解耦系统。通过全局服务目录动态查找服务,避免硬编码依赖。在AgileEAS.NET中,服务定位器以静态类形式封装服务注册与检索功能。示例展示了如何注册与获取服务实例,如在`UserController`中通过服务定位器使用`IUserService`。此模式整合到框架生命周期管理,便于各处获取服务实例,提升开发效率。然而,应适度使用并考虑依赖注入容器以增强代码可维护性和可测试性。
106 4
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
58 0
入门网络,少不了这份详细的网络基础学习指南!
入门网络,少不了这份详细的网络基础学习指南!
213 0
技术好文共享:讲讲什么是JMM
技术好文共享:讲讲什么是JMM
69 0
技术好文共享:计算机发展历程
技术好文共享:计算机发展历程
118 0
AI助理

你好,我是AI助理

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