【问题标题】:Targeting both .NET 3.5 and Silverlight同时面向 .NET 3.5 和 Silverlight
【发布时间】:2010-11-07 23:56:23
【问题描述】:

假设我已经有一个构建 .NET 3.5 程序集的项目。现在我想为 Silverlight 构建这个程序集,此外,以最小的努力维护其 Silverlight 版本。

什么是不可接受的:

  • 为 Silverlight 构建创建单独的项目

什么是可接受的:

  • 添加自定义指令允许我根据例如 Silverlight 或 .NET 来定位MSBuild 属性。
  • 为 Silverlight 添加特殊构建配置
  • 将#ifdef Silverlight / #endif 部分添加到源代码中。
  • 通常对 .csproj / .cs 进行任何其他修改。

所以基本上,我想维护一个项目,但针对两个框架。我不想维护两个单独的项目,因为这可能会导致错误,例如忘记包含新文件。如果有很多项目和大团队,排除此类错误非常重要。

如果这完全不可能,任何提供类似好处的解决方案都是可以接受的。

【问题讨论】:

  • 问题不清楚。您想构建一个程序集,然后在 Silverlight 应用程序中使用该程序集的方法等吗?由于您在 Silverlight 中的大部分实际工作都是通过与 Web 服务的通信完成的,因此我不确定您是否有问题。也许您有分层问题?这意味着您的层级之间没有明确的定义。
  • Silverlight 是 .NET 3.5。我相信您的意思是 Silverlight 和 WPF。此外,它与这个问题非常相似:stackoverflow.com/questions/208123/…
  • Silverlight 是 .NET 3.5?似乎不可能,因为正如您刚才所说,它的项目引用了不同的 mscorlib。而且,它是完全不同的执行平台……
  • “你想构建一个程序集,然后在 Silverlight 应用程序中使用该程序集的方法等” - 是的,完全正确。假设我想分享例如.NET 和 Silverlight 应用程序之间的 BLL\DAL 代码相同。
  • 因此,假设我想构建一个包含 Calculator 类的程序集,其中包含单个对象 Calculate(string expression) 方法,并且我需要构建此程序集的 2 个版本:一个用于 .NET 3.5,另一个用于- 对于 Silverlight。

标签: .net silverlight msbuild build csproj


【解决方案1】:

您是否还排除了从 Silverlight 项目链接到项目中的文件的可能性?这是在 Silverlight 和完整 CLR 之间共享实现的一种相当常见的方法。 Sharing Code Between .NET and Silverlight Platforms

此外,根据 Justin Angel 的说法,您可以参考和使用完整 CLR 中的 Silverlight 类库。我自己没有尝试过,它留下了一些未回答的问题,但它确实使场景变得简单:http://silverlight.net/blogs/justinangel/archive/2008/12/29/using-silverlight-dlls-on-the-desktop.aspx

【讨论】:

【解决方案2】:

我同意斯科特的观点。为自己省去很多痛苦。共享相同代码库的两个项目是要走的路。你需要它来在两种环境中使用 VStudio,使用不同的库,包含/排除文件,做很多事情......轻松!

拥有两个项目的原因远远超过拥有一个的借口。

【讨论】:

    【解决方案3】:

    MSDN 包含有关平台多目标的详细信息: Multi-targeting on MSDN

    【讨论】:

      【解决方案4】:

      我认为您需要做的是适当地分层。您的 Silverlight 代码应仅用于 UI 以及与后端 WCF 服务的通信。这些服务将运行您的 .NET 3.5 代码(您想要共享的代码)。这样你也有共享和 n 层。

      如果您在 Silverlight 代码中的客户端进行大量计算,然后将其提交到服务器(可能还有数据库),那么我认为您正在打开一个安全漏洞。

      您没有给出一个令人信服的理由,说明一个单独的项目需要访问 Silverlight 项目中的代码。

      【讨论】:

      • 我了解 Silverlight \ RIA 应用程序的架构,我之所以提出这个问题是因为我确切地知道我需要什么。所以这个建议总体上是好的,但在这里它根本不适合。
      • 可能有很多原因需要对客户端进行大量计算 - 例如。想象一下,我想在本地对一些数据(比如说 1MB)进行排序。我已经把它交付给客户端了,它的排序成本比直接从服务器获取排序数据的成本要小得多。
      • 这只是一个例子。另一个是 Paint.NET 类程序。在这种情况下,许多过滤效果必须在本地处理。附言不要告诉我 Silverlight 3.0 位图和 GPU 加速,我知道这一点。总之,我需要一个准确的答案。
      【解决方案5】:

      您必须有两个项目,因为这两个平台的 mscorlib 引用不同。

      看看这个问题:http://www.google.ca/search?hl=en&q=targetting+silverlight+and+wpf&meta=&aq=f&oq=

      如果您只想拥有一个在两者之间共享的常规旧 .NET 库,那么我建议创建两个项目(一个用于 Silverlight,一个用于常规)并在两个项目中包含相同的文件。这对于其他开发人员来说更容易理解。

      【讨论】:

      • 我可以禁用\启用必要的选项,例如with Condition=" '$(SilverlightBuild)' != '' " ?
      • 如果你愿意,你可以。但是您不必这样做,因为它们已合并到两个项目文件中。例如每个 .csproj #defines SL 或 WPF 或 NET35。每个 csproj 包含/排除它需要的任何文件/库。也不要链接文件,将 csproj 放在同一个目录中,然后“添加 -> 现有项目”。
      • 关于“我可以禁用” - 我的意思是“我可以使用 MSBuild Condition 属性维护单个项目吗?”
      猜你喜欢
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2011-09-01
      • 2019-05-10
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多