使用Roslyn创建可移植类库是否可行?

6

这是一个非常简单的代码,它生成了一个可以从可移植类库引用的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);
            }
        }
    }
}
2个回答

5
是的。可移植类库(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扩展)或Visual Studio 2012。


谢谢Immo,我想它同样适用于Silverlight,那么如果我想在客户端生成程序集,Roslyn能否在Silverlight内编译呢? - Paulo Vilá
为了编译PLC,您需要引用程序集。鉴于引用程序集要求安装目标包或Visual Studio,因此基本上需要开发人员的计算机。因此,在一般情况下,我会说答案是否定的。为什么要在客户端编译PCL?如果此程序集仅在客户端使用,则似乎也可以是特定于平台的,即可以直接针对Silverlight进行编译。 - Immo Landwerth
是的,我的离线应用程序已经包含了所有编译所需的dll,包括asyc targeting pack或其他内容。我需要动态编译代码的原因是因为有一些验证规则来自服务器。Roslyn目前的技术水平似乎还不够成熟(我相信Eric Lippert想打断我的腿),如果没有在客户端进行编译的可能性。 - Paulo Vilá
也许我漏掉了什么,但这不是 Roslyn 的限制。例如,如果您想编译 C++ 代码,则需要头文件。缺少头文件几乎不是编译器的限制。引用程序集与头文件具有相同的目的;它们告诉编译器可用的 API。从编译器的角度来看,它们与常规程序集没有任何区别。为什么不能针对 Silverlight 程序集进行编译? - Immo Landwerth

0

我相信Paulo是在问是否可以在Silverlight/可移植应用程序中使用Roslyn。答案是否定的,因为Roslyn目前只能在桌面CLR上以完全信任的方式工作。这当然是我们未来想要实现的功能。


不,我相信他想使用Roslyn创建可移植的汇编代码。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接