我有一个项目,希望能够在 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# 源文件的多个副本的最简单方法是简单地向现有文件添加链接,而不是添加副本。
具体方法如下。
首先决定哪个项目是“master”。这应该包含所有(或至少大部分)文件,就像正常的源代码文件一样。根据您的描述,您可能可以决定为此使用哪些项目。
然后,在这些其他项目中首先确保您没有对文件进行本地更改(如果有,请参阅下文)。如果不这样做,请继续执行以下操作:
- 从其他项目中删除文件
- 在现在为空的项目中使用“添加现有项目”重新添加,但在文件选择对话框中使用“添加”按钮上的下拉菜单并选择“添加为链接”。从主项目的文件夹中选择文件并使用此功能。
现在,这会将其他(非主)项目链接到属于主项目一部分的一组源代码。
如果有本地更改该怎么办?
您总是会发现需要进行一些本地更改,在一个平台上可用的类在另一个平台上不可用,或者您需要稍微不同的代码。一个典型的问题是,某些构造函数在不同平台上可能会丢失。
在这种情况下,您将在项目中设置一组条件定义,并使用 #if
指令来处理此问题。希望您没有巨大差异,否则这会让您的代码变得一团糟。如果您可以使用它,代码将如下所示:
#if UAP
... code for the UAP platform here
#else
... code for all the other platforms here
#endif
此外,现在还有一个针对 .NET Standard 的新项目类型,并且该单一项目类型可以同时针对多个平台。
要使用此功能,请按照以下步骤操作:
- 创建一个新的 .NET Standard 项目,并将其配置为针对跨平台使用所需的特定 .NET Standard级别
- 在文本编辑器中编辑 .csproj 文件(顺便说一句,您可以在 Visual Studio 2017 中执行此操作)
找到如下所示的行:
<TargetFramework>netstandard1.3</TargetFramework>
并将其更改为:
<TargetFrameworks>netstandard1.3;net45;net46</TargetFrameworks>
注意此处 xml 节点的复数更改
关于c# - 为 UAP 和 .NET4.5 编译相同的 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45607888/