【问题标题】:Is it possible to create a Portable class library with Roslyn?是否可以使用 Roslyn 创建可移植类库?
【发布时间】:2013-04-27 11:03:48
【问题描述】:

这是一个非常简单的代码,它生成一个可以从可移植类库中引用的 dll,但是,它很容易出错,因为当我添加任何引用时,它接受不可移植的引用。 如何确定我要生成的内容在便携式配置文件中? 代码如下:

using System.IO;
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;

namespace Ros1
{
    class Program
    {
        static void Main(string[] args)
        {

            SyntaxTree tree = SyntaxTree.ParseText(
@"using System;

namespace HelloWorld
{   
    public class A
    {
        public int Sum(int a, int b)
        {
          return a + b;
        }
    }
}");
            var co = new CompilationOptions(OutputKind.DynamicallyLinkedLibrary);
            var compilation = Compilation.Create("HelloWorld", co)
                                 .AddReferences(MetadataReference.CreateAssemblyReference("mscorlib"))
                                 .AddSyntaxTrees(tree);

            using (var file = new FileStream("Sum.dll", FileMode.Create))
            {
                compilation.Emit(file);
            }
        }
    }
}

【问题讨论】:

    标签: c# portable-class-library roslyn


    【解决方案1】:

    是的。可移植类库 (PCL) 作为一个概念对编译器是透明的。它基本上只是一个项目系统和参考程序集功能。如果你想创建一个可移植的类库,目标是 .NET for Windows Store 应用程序和 .NET 4.5,你应该针对这个文件夹中的程序集进行编译:

    %ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile7
    

    每个配置文件文件夹都有一个名为 SupportedFrameworks 的子目录,指示它支持哪些框架。

    要使 PCL 在 Visual Studio 中正常工作,您还应该包含 TargetFrameworkAttribute。确保版本和配置文件设置正确。对于上面的示例,您需要

    [assembly: TargetFramework(".NETPortable,Version=v4.5,Profile=Profile7", 
                               FrameworkDisplayName=".NET Portable Subset")]
    

    我认为我们不会在 Visual Studio 之外提供这些程序集,因此您需要安装 Visual Studio 2010(带有PCL extension installed)或 Visual Studio 2012。

    【讨论】:

    • 谢谢 Immo,我想它同样适用于 Silverlight,现在如果我想在客户端生成程序集怎么办,Roslyn 是否可以在 Silverlight 中编译?
    • 为了编译 PLC,您需要有参考程序集。鉴于参考程序集需要安装目标包或 Visual Studio,它基本上需要开发人员机器。所以在一般情况下,我会说答案是否定的。为什么要在客户端编译 PCL?如果这个程序集仅在客户端上使用,它也可能是特定于平台的,即您可以直接针对 Silverlight 进行编译。
    • 是的,我的 Out of browser 应用程序已经拥有编译所需的所有 dll,包括 asyc 目标包或任何其他。我需要动态编译代码的原因是因为有一些来自服务器的验证规则。如果无法在客户端进行编译,那么 Roslyn 的当前技术状态似乎是半生不熟(我敢肯定 Eric Lippert 想打断我的腿)。
    • 可能是我遗漏了一些东西,但这不是 Roslyn 的限制。例如,如果要编译 C++ 代码,则需要头文件。缺少头文件几乎不是编译器的限制。参考程序集的作用与头文件相同;它们告诉编译器哪些 API 可用。从编译器的角度来看,它们与常规程序集没有任何不同。为什么编译 Silverlight 程序集不适合您?
    【解决方案2】:

    我相信 Paulo 会问是否可以在 Silverlight/便携式应用程序中使用 Roslyn。答案是否定的,Roslyn 目前只能在桌面 CLR 上完全信任地工作。这当然是我们希望在未来启用的功能。

    【讨论】:

    • 否;我相信他想使用 Roslyn 创建一个便携式程序集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多