簡體   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