Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 8 在Win8和WP8应用程序中共享静态库 我有一个C++语言编写的静态库,我希望能在.NET中编写Windows 8和Windows Phone 8应用程序。_Windows 8_Windows Phone 8_Portable Class Library - Fatal编程技术网

Windows 8 在Win8和WP8应用程序中共享静态库 我有一个C++语言编写的静态库,我希望能在.NET中编写Windows 8和Windows Phone 8应用程序。

Windows 8 在Win8和WP8应用程序中共享静态库 我有一个C++语言编写的静态库,我希望能在.NET中编写Windows 8和Windows Phone 8应用程序。,windows-8,windows-phone-8,portable-class-library,Windows 8,Windows Phone 8,Portable Class Library,我希望通过设置我的解决方案(如下所示),尽量减少要维护的独立项目的数量: 尝试#1:只有UI项目是特定于平台的 问题:< /强>似乎可移植类库不支持以任何形式包含本机C++代码。 一种在Windows 8和Windows Phone 8应用程序中包含本地C++的方法是通过创建Windows运行时组件。不幸的是,针对Win8和Wp8的WRC项目是不同的项目类型;没有选项创建针对多个平台的Windows运行时组件 因此,为每个目标平台创建Windows运行时组件项目会产生以下结果: 尝试#2-UI

我希望通过设置我的解决方案(如下所示),尽量减少要维护的独立项目的数量:

尝试#1:只有UI项目是特定于平台的

<强>问题:< /强>似乎可移植类库不支持以任何形式包含本机C++代码。

一种在Windows 8和Windows Phone 8应用程序中包含本地C++的方法是通过创建Windows运行时组件。不幸的是,针对Win8和Wp8的WRC项目是不同的项目类型;没有选项创建针对多个平台的Windows运行时组件

因此,为每个目标平台创建Windows运行时组件项目会产生以下结果:

尝试#2-UI项目是特定于平台的,LegacyLib包装器也是如此 问题:当我试图从LegacyWrc_Win8项目中引用LegacyLib时;我看到以下警告:

不建议添加对“LegacyLib”的引用,因为它与Windows应用商店应用程序不兼容

构建环境表示,要使LegacyLib静态库与我的Win8 Windows运行时组件兼容,我必须在LegacyLib项目配置中启用Windows应用商店应用程序支持(忽略警告只会导致以后出错):

  • 项目属性>配置属性>常规>项目默认值
  • 将Windows应用商店应用程序支持设置为“是”
接下来,当我尝试对LegacyWrc_Wp8项目执行相同的操作时,我得到以下错误:

无法添加对“LegacyLib”的引用,因为这两个项目针对不同的平台

因此,使静态库与Windows 8兼容使其与Windows 8 Phone不兼容

看起来,即使库本身不包含特定于平台的代码,也不可能构建一个可供这两个不同平台使用的静态库

我不必维护源代码的并行版本,但我必须创建/维护两个独立的项目,每个项目都构建一个特定于平台的静态库版本

我的解决方案现在每个项目都有一个特定于平台的版本:

尝试#3-每个项目都是特定于平台的 问题:到目前为止,我看不到任何问题(除了这是一个丑陋且维护成本较高的事实)

顺便说一句,我确实研究了使用构建配置的可能性,但它们已经被用于调试/发布和x86/ARM的组合。将Win8/Wp8添加到混合中只会使配置再次翻倍,而且您已经改变了配置,而不是减少了维护负担。

我错过什么了吗?这似乎是一件很平常的事。是否有其他人经历过这一过程并提出了替代/更好的方法

编辑以确保完整性 这就是我最后做的

MySolution.sln
|
+- LegacyApiLib               (virtual folder to group projects below)
|  |
|  +- CommonCppSource         Common C++ source code used by LegacyWrc_*.vcxproj projects
|  |                          below
|  |
|  +- LegacyPcl.csproj        Portable class library with C# API interfaces only; no
|  |                          implementation classes.
|  |
|  +- LegacyWrc_Win8.vcxproj  Platform-specific Windows Runtime Component project - includes
|  |                          legacy C++ files, and uses C++/CX to expose static methods and
|  |                          classes to .NET in Win8.
|  |
|  +- LegacyWrc_Wp8.vcxproj   Platform-specific Windows Runtime Component project - includes
|                             legacy C++ files, and uses C++/CX to expose static methods and
|                             classes to .NET in WP8.
|
+- SampleApp                  (virtual folder to group projects below)
   |
   +- SampleAppBL.csproj      Portable class library containing the app's business logic.
   |                          References LegacyPcl.csproj for legacy API interface definitions.
   |                          Business logic is written against those interfaces; never against
   |                          specific classes. The Win8 or WP8 apps will reference the
   |                          appropriate Windows Runtime Component project, create or register
   |                          the concrete classes that implement the legacy API interface, and
   |                          either pass it into the BL or register it with IOC mechanism. In
   |                          this way, SampleAppBL.csproj never has to know about (or
   |                          reference) any of the WRC projects. 
   |
   +- SampleAppUI_Win8.csproj Platform-specific App project - References LegacyWrc_Win8.vcxproj
   |                          and SampleAppBL. Contains minimal platform-specific Win8 UI code.
   |
   +- SampleAppUI_Wp8.csproj  Platform-specific App project - References LegacyWrc_Wp8.vcxproj
                              and SampleAppBL. Contains minimal platform-specific WP8 UI code.

我意识到,LeaCyyApILB导出的几个辅助类可以用托管C++编写而不是用C语言编写。这意味着我可以将它们与WRC项目捆绑在一起,这简化了一些事情。

正如您所发现的,本机库需要为每个平台分别编译,因此不能直接从可移植类库中引用

我建议使用抽象模式,允许您通过可移植类库共享大部分.NET代码(即模型和视图模型)。在PCL中,为本机库中公开的功能创建接口或抽象类。然后在特定于平台的项目中实现这些功能,将调用转发到本机库。最后,使用依赖注入来连接这些接口的实现,以便您可以从共享PCL调用它们

以下是几篇关于这方面的博客文章:

MySolution.sln
|
+- Library                    (virtual folder to group projects below)
|  |
|  +- LegacyLib.vcxproj       Static Library project - Platform-independant, native C++ code using STL & CRT. Just enough C++/CX to make some types available to .NET and expose a few static methods.
|  |
|  +- LegacyWrc_Win8.csproj   Platform-specific Windows Runtime Component project - References LegacyLib, adds some types, wrappers, interfaces, etc. written in C#.
|  |
|  +- LegacyWrc_Wp8.csproj    Platform-specific Windows Runtime Component project - References LegacyLib, adds some types, wrappers, interfaces, etc. written in C#.
|
+- SampleApp                  (virtual folder to group projects below)
   |
   +- CommonAppSrc            C# source code (e.g. Model and ViewModel classes).
   |
   +- SampleApp_Win8.csproj   Platform-specific App project - References LegacyWrc_Win8, includes files from CommonAppSrc using "Add as Link".
   |
   +- SampleApp_Wp8.csproj    Platform-specific App project - References LegacyWrc_Wp8, includes files from CommonAppSrc using "Add as Link".
MySolution.sln
|
+- Library                        (virtual folder to group projects below)
|  |
|  +- NativeCode                  (virtual folder to group projects below)
|  |  |
|  |  +- CommonLibSrc             Native C++ source code using STL & CRT. Just enough C++/CX to make some types available to .NET and expose a few static methods.
|  |  |
|  |  +- LegacyLib_Win8.vcxproj   Platform-specific Static Library project - Includes files from CommonLibSrc using "Add as Link".
|  |  |
|  |  +- LegacyLib_Wp8.vcxproj    Platform-specific Static Library project - Includes files from CommonLibSrc using "Add as Link".
|  |
|  +- DotNetWrapper               (virtual folder to group projects below)
|     |
|     +- CommonWrcSrc             Platform-independant C# source code (types, wrappers, interfaces, etc. for LegacyLib support) for the Windows Runtime Component projects.
|     |
|     +- LegacyWrc_Win8.csproj    Platform-specific Windows Runtime Component project - References LegacyLib_Win8, includes files from CommonWrcSrc using "Add as Link".
|     |
|     +- LegacyWrc_Wp8.csproj     Platform-specific Windows Runtime Component project - References LegacyLib_Wp8, includes files from CommonWrcSrc using "Add as Link".
|
+- SampleApp                      (virtual folder to group projects below)
   |
   +- CommonAppSrc                Platform-independant C# source code (e.g. Model, ViewModel).
   |
   +- SampleApp_Win8.csproj       Platform-specific App project - References LegacyWrc_Win8, includes files from CommonAppSrc using "Add as Link".
   |
   +- SampleApp_Wp8.csproj        Platform-specific App project - References LegacyWrc_Wp8, includes files from CommonAppSrc using "Add as Link".
MySolution.sln
|
+- LegacyApiLib               (virtual folder to group projects below)
|  |
|  +- CommonCppSource         Common C++ source code used by LegacyWrc_*.vcxproj projects
|  |                          below
|  |
|  +- LegacyPcl.csproj        Portable class library with C# API interfaces only; no
|  |                          implementation classes.
|  |
|  +- LegacyWrc_Win8.vcxproj  Platform-specific Windows Runtime Component project - includes
|  |                          legacy C++ files, and uses C++/CX to expose static methods and
|  |                          classes to .NET in Win8.
|  |
|  +- LegacyWrc_Wp8.vcxproj   Platform-specific Windows Runtime Component project - includes
|                             legacy C++ files, and uses C++/CX to expose static methods and
|                             classes to .NET in WP8.
|
+- SampleApp                  (virtual folder to group projects below)
   |
   +- SampleAppBL.csproj      Portable class library containing the app's business logic.
   |                          References LegacyPcl.csproj for legacy API interface definitions.
   |                          Business logic is written against those interfaces; never against
   |                          specific classes. The Win8 or WP8 apps will reference the
   |                          appropriate Windows Runtime Component project, create or register
   |                          the concrete classes that implement the legacy API interface, and
   |                          either pass it into the BL or register it with IOC mechanism. In
   |                          this way, SampleAppBL.csproj never has to know about (or
   |                          reference) any of the WRC projects. 
   |
   +- SampleAppUI_Win8.csproj Platform-specific App project - References LegacyWrc_Win8.vcxproj
   |                          and SampleAppBL. Contains minimal platform-specific Win8 UI code.
   |
   +- SampleAppUI_Wp8.csproj  Platform-specific App project - References LegacyWrc_Wp8.vcxproj
                              and SampleAppBL. Contains minimal platform-specific WP8 UI code.