繁体   English   中英

为UAP和.NET4.5编译相同的C#代码

[英]Compile identical C# code for UAP and .NET4.5

我有一个项目,希望在UWP / UAP10.0项目和.NET4.5 Web API项目(或使用常规类库的任何其他类型)中都可以作为nuget包使用。

我已将原始.NET4.5代码移植到可移植类库中,以便能够将其打包为nuget并在UWP环境中使用。 我现在的问题是,我不能在nuget包的常规.NET4.5应用程序中使用相同的dll(相同的dll,多个lib目标)。

我目前正在Visual Studio中编译和打包两个项目:一个可移植类库,一个类库。

这一点根本没有效率,因为我有完全相同的代码副本。 有什么办法可以将一个项目维护/构建到nuget包的多个类库中? 还是有另一个项目包含可移植类库和类库都引用的相同代码?

这是我目前在nuspec中所做的事情:

  <file src="MyApp\bin\Release\MyApp.dll" target="lib\net45\MyApp.dll" />

  <!-- .NET 4.5.2 -->
  <file src="MyApp\bin\Release\MyApp.dll" target="lib\net452\MyApp.dll" />

  <!-- .NET 4.6 -->
  <file src="MyApp\bin\Release\MyApp.dll" target="lib\net46\MyApp.dll" />

  <!-- UAP -->
  <file src="MyApp.Portable\bin\Release\MyApp.Portable.dll" target="lib\uap10.0\MyApp-Uap10.dll" />

嗯,保留现有结构但避免在磁盘上拥有C#源文件的多个副本的最简单方法是简单地向现有文件添加链接 ,而不是添加副本

这是如何做。

首先确定哪个项目是“主人”。 作为普通的源代码文件,它应该包含所有(或至少大多数)文件。 根据您的描述,您可能只需要确定已经要用于哪个项目。

然后,在其他项目中, 首先请确保您没有对文件进行本地更改(如果有,请参阅下文) 如果不这样做,请继续执行以下操作:

  1. 从其他项目中删除文件
  2. 在现在为空的项目中使用“添加现有项”重新添加,但是在文件选择对话框中,使用“添加”按钮上的下拉菜单,然后选择“添加为链接”。 从主项目的文件夹中选择文件,然后使用此功能。

现在,这会将其他(非主项目)项目链接到作为主项目一部分的单个源代码集。


如果您进行了本地更改,该怎么办?

总是会发现您需要一些本地更改,一个平台上可用的类不在另一个平台上,或者您需要稍微不同的代码。 一个典型的问题是,不同平台上可能缺少某些构造函数。

在这种情况下,您将在项目中设置一组条件定义,并使用#if指令进行处理。 希望你没有大量的差异或这将会使你的代码一团糟。 如果可以使用它,它将使代码如下所示:

#if UAP
... code for the UAP platform here
#else
... code for all the other platforms here
#endif

此外,针对.NET Standard,现在有一个新的项目类型,并且该单个项目类型可以同时针对多个平台。

要使用此程序,请遵循以下步骤:

  1. 创建一个新的.NET Standard项目,并将其配置为针对跨平台使用所需的特定.NET Standard 级别。
  2. 在文本编辑器中编辑.csproj文件(可以在Visual Studio 2017中执行此操作)
  3. 找到看起来像这样的行:

     <TargetFramework>netstandard1.3</TargetFramework> 

    并将其更改为:

     <TargetFrameworks>netstandard1.3;net45;net46</TargetFrameworks> 

    注意此处对xml节点的复数更改

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM