在 WPF 框架开发中,其实很少有开发者有足够的勇气去更改现有的框架逻辑,因为 WPF 的功能十分庞大,很难测试全。更多的开发都是加功能以及开放已有功能。整个 WPF 框架的大体设计是十分好的,可以在框架里面遵循对修改关闭的原则,定制化更多的是做注入,调用 internal 权限成员

本文告诉大家如何给 WPF 框架加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员

如果我不新加入一个程序集,而是在原有的程序集开发,加上新功能,是否可行?肯定是可以的,但是这样做的开发效率不够好。因为我为了在 VisualStudio 上构建 WPF 框架,我加入了一些构建黑科技,此时的 WPF 框架丢失了增量构建的功能。而一次 WPF 框架的构建需要 20 分钟

因为我在 WPF 框架的定制开发中,更多的是访问 internal 权限成员添加新的类等,我几乎没有想去更改现有的逻辑。所以最简方法就是添加一个程序集,让整个 WPF 框架的 internal 权限成员可以被我添加的程序集访问。实现的方法是 InternalsVisibleToAttribute 特性

因为 WPF 是一个带签名的框架,大家都知道,一个带签名的程序集如果设置 InternalsVisibleToAttribute 特性,要求被设置的程序集也是被签名的,详细请看 dotnet 强签名下使用 InternalsVisibleToAttribute 给程序集加上友元

接下来我需要新建一个程序集,我这里叫 dotnetCampus.WPF 程序集,在这个程序集里面自己新建签名,然后配置到 WPF 框架各个项目

做法就是先通过 dotnet 强签名下使用 InternalsVisibleToAttribute 给程序集加上友元 拿到签名,然后拼接 InternalsVisibleToAttribute 的内容

[assembly:InternalsVisibleTo("dotnetCampus.WPF, PublicKey=0024000004800000940000000602000000240000525341310004000001000100256f5cb79140dbc25623807d6823ca4b5b602209eaaf71f064e5926a7039c24351c1e2ad3130e194631307ed36a76ad4b832e237a467fefbd693428c7ecc5d4cc26796f6f8b705311948e00f2be5fa2db52ddff50a5b3eb0acc715b45618c1a92532ae2326529fb9e0f58a44abf31e9b5701994464186d3b9f52169b6e0f80b9")]

将上面代码放在 WPF 的每个项目,此时就可以完成了 WPF 的配置了。下一步就是将这个 WPF 仓库构建一下,可以使用命令行方式构建,详细请看 手把手教你构建 WPF 框架的私有版本

在构建完成之后,从 WPF 的 artifacts 文件夹里面,可以在 artifacts\packaging\Release\Microsoft.DotNet.Wpf.GitHub 文件夹找到构建输出的所有内容

有两个方法,一个是打包为 NuGet 包,另一个方法是作为 Dll 引用。我推荐使用 Dll 引用的方式,这个方式使用起来更简单

做出 Dll 引用的方法需要先做一些准备

先创建一个空白的 WPF 引用,然后使用 self-contained 独立方式发布,发布的时候小心 x86 和 x64 的不同。使用 x86 和 x64 需要和 WPF 打包关联,我当前用的都是 x86 下的

拿出来空白 WPF 的发布输出内容,放在 CustomWPF\Lib 文件夹

artifacts\packaging\Release\Microsoft.DotNet.Wpf.GitHub\lib\netcoreapp5.0 的文件内容拷贝替换 CustomWPF\Lib 文件夹的文件,上面的 netcoreapp5.0 是需要根据你具体构建的 WPF 框架而更改

接着还需要将 artifacts\packaging\Release\Microsoft.DotNet.Wpf.GitHub\runtimes\win-x86\native 文件夹里面的 Native 部分内容也拷贝到 CustomWPF\Lib 文件夹。其实在 WPF 中使用 x86 或 x64 构建的不同就是 runtimes 文件夹内的文件而已

现在就构建完成了 Lib 自己定制版本的依赖文件了,接下来就是将 dotnetCampus.WPF 程序集拷贝出来,放在 CustomWPF 文件夹里面。在 dotnetCampus.WPF.csproj 添加引用

  <ItemGroup><Reference Include="..\Lib\DirectWriteForwarder.dll" /><Reference Include="..\Lib\Microsoft.VisualBasic.Forms.dll" /><Reference Include="..\Lib\PresentationCore.dll" /><Reference Include="..\Lib\PresentationFramework-SystemCore.dll" /><Reference Include="..\Lib\PresentationFramework-SystemData.dll" /><Reference Include="..\Lib\PresentationFramework-SystemDrawing.dll" /><Reference Include="..\Lib\PresentationFramework-SystemXml.dll" /><Reference Include="..\Lib\PresentationFramework-SystemXmlLinq.dll" /><Reference Include="..\Lib\PresentationFramework.Aero.dll" /><Reference Include="..\Lib\PresentationFramework.Aero2.dll" /><Reference Include="..\Lib\PresentationFramework.AeroLite.dll" /><Reference Include="..\Lib\PresentationFramework.Classic.dll" /><Reference Include="..\Lib\PresentationFramework.dll" /><Reference Include="..\Lib\PresentationFramework.Luna.dll" /><Reference Include="..\Lib\PresentationFramework.Royale.dll" /><Reference Include="..\Lib\PresentationUI.dll" /><Reference Include="..\Lib\ReachFramework.dll" /><Reference Include="..\Lib\System.Design.dll" /><Reference Include="..\Lib\System.Drawing.Common.dll" /><Reference Include="..\Lib\System.Drawing.Design.dll" /><Reference Include="..\Lib\System.Drawing.dll" /><Reference Include="..\Lib\System.Printing.dll" /><Reference Include="..\Lib\System.Private.DataContractSerialization.dll" /><Reference Include="..\Lib\System.Private.Uri.dll" /><Reference Include="..\Lib\System.Private.Xml.dll" /><Reference Include="..\Lib\System.Private.Xml.Linq.dll" /><Reference Include="..\Lib\System.Security.Cryptography.OpenSsl.dll" /><Reference Include="..\Lib\System.Windows.Controls.Ribbon.dll" /><Reference Include="..\Lib\System.Windows.Forms.Design.dll" /><Reference Include="..\Lib\System.Windows.Forms.Design.Editors.dll" /><Reference Include="..\Lib\System.Windows.Forms.dll" /><Reference Include="..\Lib\System.Windows.Forms.Primitives.dll" /><Reference Include="..\Lib\System.Windows.Input.Manipulations.dll" /><Reference Include="..\Lib\System.Windows.Presentation.dll" /><Reference Include="..\Lib\System.Xaml.dll" /><Reference Include="..\Lib\UIAutomationClient.dll" /><Reference Include="..\Lib\UIAutomationClientSideProviders.dll" /><Reference Include="..\Lib\UIAutomationProvider.dll" /><Reference Include="..\Lib\UIAutomationTypes.dll" /><Reference Include="..\Lib\WindowsBase.dll" /><Reference Include="..\Lib\WindowsFormsIntegration.dll" /></ItemGroup>

现在尝试在 dotnetCampus.WPF 程序集内写代码,这里的代码可以访问 WPF 框架的 internal 成员

我将上面的制作完成的内容放在 CSDN 下载 欢迎小伙伴下载来试试

这部分的 WPF 代码我也放在 GitHub 欢迎小伙伴访问


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

WPF 框架开发 加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员相关推荐

  1. WPF框架教程 | 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(https://blog.csdn.net/lzuacm/ar ...

  2. C#/WPF入门到多项目实战开发教程1——Grid、自定义按钮模板、WPF框架中的动画

    视频地址:https://www.bilibili.com/video/BV13U4y1e7fx?p=8&spm_id_from=pageDriver&vd_source=5dc01f ...

  3. 基于WPF的开发的知识点

    基于WPF的开发 一.XAML 语言 XAML被编译为BAML(Binary Application Markup Language)文件.通常,BAML文件比XAML更小,编译后的BAML都是Pre ...

  4. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息] ...

  5. jQuery:收集一些基于jQuery框架开发的控件/jquery插件2

    Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. 主页:http://letmehaveblog.blogspot.com/2007/10/ ...

  6. Microsoft .net 框架开发平台体系架构

    .net 平台构成 1 底层操操作系统 windows 由于Web服务和使用Web服务的应用程序仍然运行在计算机上,而且既然是计算机都 要有外设,所以我们仍然需要一个操作系统.. Windows添加了 ...

  7. WPF 4 开发Windows 7 跳转列表(JumpList)

    原文:WPF 4 开发Windows 7 跳转列表(JumpList) 在之前写过的<Windows 7 任务栏开发系列>中我们通过Visual Studio 2008 借助微软提供的Wi ...

  8. [导入]ASP.NET MVC框架开发系列课程(3):URL导向.zip(16.66 MB)

    讲座内容: ASP.NET MVC框架中一个关键特性就是基于URL的导向.本次课程将讲解URL Routing机制的使用. 课程讲师: 赵劼 MSDN特邀讲师 赵劼(网名"老赵". ...

  9. Android:理想的框架开发母板——高焕堂

    前言 依据<第三智慧>一书作者Danah Zohar的研究,东方人头脑思维偏向模拟(如Neural-network)模型,而西方人偏向牛顿的推里(如Rule-based)思维习惯.根据笔者 ...

  10. WPF PRISM开发入门一( 初始化PRISM WPF程序)

    原文:WPF PRISM开发入门一( 初始化PRISM WPF程序) 这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在G ...

最新文章

  1. Tomcat的常用配置
  2. simulink中mpc模块怎么使用_Controllogix系统中ILX34MBS485模块使用
  3. 四川第七届 C Censor (字符串哈希)
  4. 基金学习201907301
  5. Android 开发工程师自述:毕业两年后,我明白的那些事!
  6. eplices如何导入外部代码_搜索引擎的蜘蛛是如何爬的
  7. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)[原创]
  8. 中国电信校园宽带客户端连接服务器无响应,天翼校园客户端出现了错误码,是在提示什么?...
  9. 集成电路实践----D触发器
  10. [week9]签到题(长凳)——贪心算法
  11. lwip协议栈在linux运行,一种轻量级的TCP_IP协议栈LwIP在嵌入式系统中的应用
  12. 射频通信PCC和SCC定义
  13. 计算机领域影响因子3.5什么水平,计算机学科SCI(包括SCI-E)影响因子排名
  14. 62道开发人员面试经典题
  15. 【uniapp】 两种上拉加载方式
  16. 基于先验激光雷达地图的2D-3D线特征单目定位
  17. 小班安全使用计算机教案,【实用】小班安全教案4篇
  18. c++入门,cout,cin
  19. linux系统运维基础
  20. uniapp html5+ plus蓝牙连接电子秤

热门文章

  1. shared pool 和buffer pool 详解(之二, Cache Buffers LRU Chain、Cache Buffers LRU Chain闩锁竞争与解决)
  2. 什么是 jsp,什么是Servlet?jsp 和Servlet 有什么区别?
  3. libiconv android编译,(OK) 编译libiconv-1.14(静态库)—CentOS 7— android-ndk
  4. 通信工程师考试基本情况及经验分享
  5. Github hosts修改
  6. 快速排序 时间复杂度计算
  7. Linux学习之 vi编辑器常用命令
  8. Chrome谷歌浏览器登入指引
  9. Spring源码下载编译全过程!超详细的步骤!!!
  10. 地埋式ID球形电子标识器|标识球在水|电|燃气|通信等行业的应用与埋设方法