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

标签 c# .net visual-studio

我有一个项目,希望能够在 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”。这应该包含所有(或至少大部分)文件,就像正常的源代码文件一样。根据您的描述,您可能可以决定为此使用哪些项目。

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

  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 节点的复数更改

关于c# - 为 UAP 和 .NET4.5 编译相同的 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45607888/

相关文章:

c# - Visual Studio 在我的 web.configs 中看到错误

c++ - 你必须去掉 WinMain 才能将项目变成库吗

c# - ComboBox遗失的项目

c# - 如何使用标记名将 HTML 文件中定义的文本框的值保存到文本文件

c# - 有没有办法模拟Azure CloudQueueClient或CloudQueue?

c# - Mono 在实际应用中的应用有多广泛?

.net - 处理收到的电子邮件

.net - ListBox.DisplayMember = [String] 我可以以某种方式解决它而不是 .NET 中的字符串吗?

c# - ASP.NET WebAPI Selfhost 没有解析到 Controller 的路由

c++ - Visual Studio 输出 .obj 但不输出 .lib