2017-08-10 53 views
1

我有一个项目可以在UWP/UAP10.0项目和.NET4.5 Web API项目中用作Nuget包(或任何其他类型,使用常规类库为UAP和.NET4编译相同的C#代码

我已经将我原来的.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" /> 
+0

你有没有考虑一个.NET标准项目类型?我无法告诉你这是否受到任何UWP使用的支持,但这会将您的项目减少到1.另外,请注意,将文件添加到其他项目时,文件选择对话框中的“添加”按钮有一个下拉列表,选择“链接”菜单项以添加到现有文件的链接。这并不能减轻将文件实际添加到多个项目的需求,但是您只能在磁盘上拥有1个源代码副本。 –

+0

您可能想看看[共享项目](http://dailydotnettips.com/2015/07/28/using-shared-project-across-multiple-applications-in-visual-studio-2015/)。这使您可以在多个其他项目之间共享一组“.cs”文件,所有项目都针对不同版本的.Net。所以你没有任何重复的文件,但是你仍然可以从那个代码中创建针对不同版本的.Net –

+0

的类库。使用共享项目(我们称之为API.Shared)的问题是虽然它允许我在两个项目类型之间共享相同的代码,但是一旦单个项目(MyProject.Portable和MyProject.Net)被编译到一个DLL中并被打包,我就不能在共享项目中公开文件外部使用nuget包时。我必须在每个项目中都有一个类来暴露共同的代码,从而破坏了这一点。我想访问所有的类,枚举等。 –

回答

2

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

以下是操作方法。

首先决定哪个项目是“主”。这应该包含所有文件(或至少大部分),作为普通的源代码文件。从你的描述中,你可能只需决定你已经为此使用了哪些项目。

然后,在那些其他项目首先确保您没有对文件进行本地更改(如果需要,请进一步查看)。如果你不这样做,用下面的继续:

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

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


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

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

在这种情况下,您将在项目中设置一组条件定义,并使用#if指令来处理此问题。希望你没有巨大的差异,否则这会使你的代码乱七八糟。如果你可以使用它,这将会使代码看起来是这样的:

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

此外,现在有一个新的项目类型,.NET标准,而这个单个项目类型可以针对在多个平台同时。

要使用此遵循以下步骤:

  1. 创建一个新的.NET标准的项目,并将其配置为针对特定的.NET标准水平您要求的跨平台使用
  2. 编辑在文本编辑器中的.csproj文件(你可以通过方式做到这一点的Visual Studio 2017年中)
  3. 查找,看起来像这样的行:

    <TargetFramework>netstandard1.3</TargetFramework> 
    

    它改成这样:

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

    注意复数改变了这里的XML节点

+0

我试图在可移植类库中使用.NET Standard,但是csproj不包含你提到的元素。我有这个: v5.0 - 值得注意的是我使用VS2015吗? –

+0

.NET Standard也有一个全新的项目类型,旧的“便携式类库”不是我所说的。不知道你是否可以使用VS2015做这个部分。 –

+0

今晚晚些时候我将不得不在VS2017中试试看看是否有效。使用“链接”方法 - 每次更新源文件时都必须更新链接吗?或者我可以在便携式应用程序中创建链接,只需修改源项目中的文件? –