2013-04-27 10 views
6

To jest bardzo prosty kod, który generuje bibliotekę dll, do której można odwoływać się z przenośnej biblioteki klas, ale jest to podatny błąd, ponieważ po dodaniu dowolnego odwołania przyjmuje niemobilne odniesienia. Jak mogę powiedzieć na pewno, że to, co usiłuję do generowania jest na przenośnym profilu ?, Oto kod:Czy można utworzyć przenośną bibliotekę zajęć z Roslyn?

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); 
      } 
     } 
    } 
} 

Odpowiedz

5

Tak. Przenośne biblioteki klas (PCL) jako koncepcja jest przezroczysta dla kompilatora. Jest to w zasadzie tylko system projektu i funkcja zestawów referencyjnych. Jeśli chcesz stworzyć przenośną bibliotekę klas kierowaną, powiedzmy .NET dla aplikacji systemu Windows Store i .NET 4.5, należy skompilować przeciwko zespołów w tym folderze:

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

Każdy folder profilu ma podkatalogu zwane SupportedFrameworks który wskazuje, które frameworki obsługuje.

Aby PCL działał świetnie w Visual Studio, powinieneś również dołączyć TargetFrameworkAttribute. Upewnij się, że wersja i profil są ustawione poprawnie. Na przykład nad tobą musiałby

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

Nie sądzę wysyłamy te zespoły poza Visual Studio, więc trzeba będzie instalacji Visual Studio 2010 (z PCL extension installed) lub Visual Studio 2012.

+0

Dziękuję Immo, przypuszczam, że to działa podobnie do Silverlight, a co jeśli chcę wygenerować montaż na kliencie, Czy Roslyn będzie mógł skompilować się w Silverlight? –

+0

Aby skompilować sterownik PLC, potrzebne są zestawy referencyjne. Biorąc pod uwagę, że zespoły referencyjne wymagają pakietu docelowego lub Visual Studio do zainstalowania, zasadniczo wymaga to komputera programisty. Więc w ogólnym przypadku powiedziałbym, że odpowiedź brzmi "nie". Dlaczego chcesz skompilować PCL na kliencie? Wydaje się, że jeśli ten zestaw jest używany tylko na kliencie, może to być również specyficzne dla platformy, tzn. Możesz skompilować bezpośrednio przeciwko Silverlight. –

+0

Tak, moja aplikacja poza przeglądarką ma już wszystkie biblioteki DLL potrzebne do kompilacji, w tym pakiet do targetowania asyc lub jakiekolwiek inne. Powodem, dla którego potrzebuję kodu skompilowanego dynamicznie, jest to, że istnieją pewne reguły sprawdzania poprawności, które pochodzą z serwera. Obecny stan Roslyn wydaje się na wpół wypieczony (jestem pewien, że Eric Lippert chce złamać nogi), jeśli nie ma możliwości skompilowania się na kliencie. –

0

Wierzę, że Paulo pyta, czy można użyć Roslyn w aplikacji Silverlight/portable. Odpowiedź brzmi: nie, Roslyn obecnie działa tylko w pełnym zaufaniu na CLR na komputerze. Jest to z pewnością coś, co chcielibyśmy włączyć w przyszłości.

+0

Nie; Wierzę, że chce stworzyć przenośny zespół za pomocą Roslyn. – SLaks