如何在UWP中使用.NET Framework 2.0编译的C# DLL?
在UWP中复用.NET Framework 2.0 DLL的最佳最简方案
Hey Lal, 我来帮你解决这个UWP复用旧.NET Framework 2.0 DLL的问题——毕竟这种老组件迁移的场景我碰过好多次了。首先得明确:UWP的运行环境(基于.NET Core/.NET 5+)和.NET Framework 2.0的CLR完全不兼容,直接引用DLL是绝对行不通的,得用间接调用的方式。下面给你两种最实用的方案,按简单程度排序:
方案1:用桌面桥(Desktop Bridge)打包,通过进程间通信调用(首推)
这是最简单也最稳妥的方式,完全不需要修改原DLL,只需要把你之前调用这个DLL的桌面逻辑封装成一个小型辅助程序,再和UWP打包在一起,通过进程间通信实现交互:
- 把原来调用.NET Framework 2.0 DLL的代码抽出来,做成一个独立的WPF/WinForms控制台或轻量窗口程序(这个程序可以正常引用2.0的DLL,因为它基于.NET Framework运行)。
- 在这个辅助程序里实现简单的通信逻辑,比如用UWP官方支持的
AppServiceConnection(应用服务),或者更轻量的命名管道、TCP套接字,用来接收UWP的请求,调用DLL处理后返回结果。 - 打开Visual Studio,创建一个Windows Application Packaging Project(打包项目),把你的UWP应用和这个辅助程序都添加到项目里,配置好打包参数。
- 在UWP代码里通过对应的通信方式调用辅助程序,完成功能交互。
为什么首推这个?因为几乎不需要改动原有业务代码,只需要加一层通信逻辑,而且桌面桥是微软官方支持的方案,兼容性和稳定性都有保障。
方案2:把DLL封装成COM组件,在UWP中调用(适合纯托管DLL)
如果你的.NET Framework 2.0 DLL是纯托管的(没有非托管依赖),可以尝试把它注册为COM组件,然后在UWP里通过COM互操作调用。不过这个步骤比方案1繁琐,还要注意权限问题:
- 如果你有DLL的源码,在项目的
AssemblyInfo.cs里添加[assembly: ComVisible(true)],重新编译;如果没有源码,用.NET Framework自带的RegAsm.exe工具注册这个DLL(注意匹配32/64位系统)。 - 在UWP项目里添加COM引用:右键项目→添加引用→COM→找到注册好的组件。
- 在UWP的
Package.appxmanifest里声明COM权限:添加com:Extension节点,指定COM类的CLSID和权限配置。 - 之后就能在UWP代码里像调用普通类一样调用COM组件的方法了。
这个方案的局限性:如果DLL有非托管依赖,或者涉及桌面级别的权限操作,很可能会触发UWP沙箱的限制,出现运行错误。
避坑提醒
- 别尝试直接把DLL转换成.NET Standard/.NET Core:供应商不更新意味着你没有源码(或者不能改),反编译修改的风险极高,而且.NET Framework 2.0的很多API在.NET Core里已经被移除,转换成功率极低。
- 注意UWP沙箱限制:不管用哪种方案,辅助程序如果需要访问UWP沙箱外的资源(比如本地文件、系统注册表),都要在打包项目里配置对应的权限声明。
内容的提问来源于stack exchange,提问作者SPB
相关产品推荐
相关产品推荐

