如果你正在做将现有的Win32 静态库
或 DLL
工程移植到Win10 UWP(通用 Windows)
环境,这篇文章可能会对你有帮助。
在VS2015的 新建项目
-> 已安装
-> 模板
-> Visual C++
-> Windows
-> 通用
页面,包含几个我们需要关心的工程类型:空白应用(通用 Windows)
、DLL(通用 Windwos)
、静态库(通用 Windows)
、Windows 运行时组件(通用 Windows)
。
根据工程说明可以知道,DLL(通用 Windwos)
和静态库(通用 Windows)
可以被空白应用(通用 Windows)
和Windows 运行时组件(通用 Windows)
使用,并且是语言相关的,不能跨语言调用。
而Windows 运行时组件(通用 Windows)
可以被空白应用(通用 Windows)
使用,是语言无关的。也就是说,不管是C++
还是C#
开发的应用都可以调用Windows 运行时组件(通用 Windows)
。
知道了这一点,那么我们来看下问题,博主(C++程序员,未接触过C#及WinPhone相关开发)遇到的情况是这样的:将现有的 Win32 平台DLL
移植到 UWP
平台,供采用 C#
开发的Win Phone APP使用,而该 DLL
还依赖其它 C++静态LIB库
和 C动态库
。
我们需要做的包括以下几个方面:
UWP
的转换首先,请下载Universal Windows Platform (UWP) app samples,将会对你有莫大的帮助。
为方便描述,做如下约定:
通用 Windows
版组件加 _rt 后缀以示区别
UWP
的转换 我们整体的工程关系转换为:
a.dll -> a_rt.lib
c++.lib -> c++_rt.lib
c.dll -> c_rt.lib
旧的依赖关系:app 依赖a.dll,a.dll 链接c++.lib,a.dll 依赖c.dll;
新的依赖关系:app 依赖shell_rt.dll,shell_rt.dll 链接a_rt.lib、c++_rt.lib、c_rt.lib,
并且shell_rt.dll 负责重新封装a.dll的接口。app 可由 C++ 或 C# 开发。
注意: 创建
Windows 运行时组件(通用 Windows)
工程时,必须保证工程内的最外层命名空间名字和最终生成的dll名字(包括winmd文件)完全一致,这也是官方的要求。
通过阅读 官方文档 得知在不重新创建工程的情况下将现有工程转换为UWP工程的方法,如下:
项目属性
”,并将“配置
”设置为“所有配置
”;项目属性
”中,在“C/C++
”、“常规
”选项卡上,将“使用 Windows 运行时扩展
”设置为“是 (/ZW)
”。这将启用组件扩展 (C++/CX);解决方案资源管理器
”中,选择项目节点,打开快捷菜单,然后选择“重定SDK版本目标
”,“确定
”;解决方案资源管理器
”中,选择项目节点,打开快捷菜单,然后选择“卸载项目
”。然后,在卸载的项目节点上打开快捷菜单,然后选择编辑项目文件。找到WindowsTargetPlatformVersion
元素并将其替换为以下元素。然后关闭 .vcxproj 文件,再次打开快捷菜单,然后选择“重新加载项目
”。现在,解决方案资源管理器会将该项目标识为 通用 Windows
项目。<AppContainerApplication>trueAppContainerApplication>
<ApplicationType>Windows StoreApplicationType>