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

时间:2017-08-10 08:06:21

标签: c# .net visual-studio

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

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

我目前正在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" />

1 个答案:

答案 0 :(得分:2)

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

这是怎样的。

首先确定哪个项目是&#34; master&#34;。这应该包含其中的所有(或至少大部分)文件,作为普通的源代码文件。根据您的描述,您可能只需确定您已经必须使用哪个项目。

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

  1. 从其他项目中删除文件
  2. 使用&#34;添加现有项目&#34;重新添加;在现在为空但在文件选择对话框中的项目中,使用&#34;添加&#34;按钮并选择&#34;添加为链接&#34;。从主项目的文件夹中选择文件并使用此功能。
  3. 现在,这将把其他(非主)项目链接到作为主项目一部分的单一源代码集。

    如果您有本地更改怎么办?

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

    在这种情况下,您将在项目中设置一组条件定义,并使用#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节点的复数更改