2009-04-06 8 views
12

Je travaille sur un projet (pur hobby, "Sharping my skills") qui a un back-end unifié et plusieurs frontaux (ASP.NET MVC 1.0/JQuery et Silverlight 2). Lorsque j'essaie d'ajouter une référence à mon assembly de couche de gestion dans le projet Silverlight 2 (VS2008); Il est rejeté, car il ne s'agit pas d'un assemblage Silverlight.Comment puis-je utiliser des assemblages non-Silverlight dans une application Silverlight?

Est-il possible d'inclure et de référencer un assembly non-Silverlight dans une application Silverlight?

Répondre

12

Non, il n'y en a pas. Silverlight fonctionne sur un CLR complètement différent qui est incompatible avec le CLR normal (de bureau). Il possède un ensemble différent d'API sous-jacentes dans la BCL et, plus important encore, un numéro de version de métadonnées différent. Ces deux facteurs, entre autres, empêchent les assemblys compilés pour le CLR de bureau de s'exécuter par défaut sur le CLR Silverlight.

Tous les assemblages doivent être compilés spécifiquement pour Silverlight.

+0

Donc, je préfèrerais ajouter la façade de service Web à ma couche de gestion et l'utiliser pour communiquer entre l'application Silverlight et le back-end? – norbertB

+0

@norbertB oui, cela semble être une bonne approche ici. – JaredPar

+0

Cela est tout à fait vrai, mais si vous voyez le deuxième lien dans mon article, quelqu'un a trouvé une façon astucieuse de convertir très facilement des assemblages .NET (bureau) compilés en fichiers Silverlight. Vous devez cependant faire attention au code que vous utilisez dans l'assemblage (et peut-être utiliser des instructions conditionnelles). – Noldorin

3

Non, il n'est pas possible de référencer des assemblys qui ne sont pas construits par rapport à l'environnement d'exécution Silverlight. La façon dont je l'ai fait est de créer un nouveau projet pour mes assemblées métier, puis d'y ajouter toutes les classes de l'assemblage d'origine. La clé est que lorsque vous les ajoutez, faites-le en tant qu'élément existant et sur le bouton Ajouter, cliquez sur la flèche vers le bas et Ajouter en tant que lien. De cette façon, vous n'avez toujours qu'une base de code unique, bien que vous deviez ajouter quelques classes telles que ApplicationException pour compenser les éléments manquants dans l'environnement d'exécution Silverlight.

+0

Il existe également un outil de liaison de projet disponible à partir de codeplex qui vous permet de conserver automatiquement deux projets en synchronisation. C'est idéal pour les objets métier. N'oubliez pas de passer à SL -> .NET, sinon vous risquez de vous retrouver avec des éléments qui ne peuvent plus être reconstruits :-) –

3

La réponse courte est non, j'ai peur. L'environnement d'exécution Silverlight a été conçu pour être un sous-ensemble du framework .NET, mais les deux ne sont pas directement compatibles. (Les temps d'exécution sont implémentés différemment, je crois, puisque Silverlight a été conçu pour être multiplate-forme.)

La bonne nouvelle est cependant que vous avez une foule de solutions de contournement. This blog post et this CodeProject article discuter de la question en profondeur et offrir une variété de solutions propres. Hope that helps ...

3

Non. La source csproj doit savoir qu'il s'agit d'un projet Silverlight. Cela peut signifier conserver deux fichiers de projet avec les mêmes fichiers ".cs" source. Il y a un truc très pratique csproj ici - (copié à partir protobuf-net où je fais cela pour plusieurs cadres):

<ItemGroup> 
    <Compile Include="..\YourMainProject\**\*.cs" /> 
</ItemGroup> 

Ensuite, il suffit de maintenir un projet; le projet Silverlight obtient tout de l'arbre. Notez que le Silverlight BCL est fortement restreint, et toutes les fonctionnalités ne seront pas disponibles. Obtenir du code compilé à la fois sur .NET et Silverlight peut être ... difficile.

Vous pouvez également utiliser des classes proxy dans l'application Silverlight (c'est-à-dire via WCF, etc.). Pas aussi riche, mais simple à faire.

1

Le runtime Silverlight est un sous-ensemble du principal .NET CLR. Bien que cela puisse paraître pénible, il y a une raison logique à cela: l'exécution de Silverlight doit être assez légère pour être un plugin de navigateur. Si vous placez vos autres classes derrière les services Web, elles peuvent fonctionner sous le runtime .Net complet pendant que votre application Silverlight s'exécute sous le CLR réduit dans le plugin du navigateur.

8

En fait, alors qu'il est difficile et probablement pas une bonne idée, il est possible de référencer des assemblages CLR dans un projet Silverlight. David Betz a un exemple sur son blog: http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight

Encore une fois, il vaut la peine de souligner que vous ne voulez probablement pas vraiment faire cela. Le framework Silverlight a été développé par des ingénieurs expérimentés, qui ont beaucoup réfléchi à ce qui devrait être inclus et ce qui ne devrait pas l'être. Pensez aux objets CLR dont vous pensez avoir besoin, et essayez de comprendre pourquoi ils ne sont pas disponibles actuellement, et quelles sont les alternatives. Enfin, n'oubliez pas que tous les objets CLR que vous ajoutez, augmenteront la taille de votre téléchargement.

2

Un mot d'avertissement, mon expérience cela vient de développer pour Windows Phone 7, donc cela pourrait être légèrement différent de Silverlight normale 3.

JaredPar a souligné le CLR Silverlight est incompatible avec CLR normal. Cela n'est pas correct à 100% car les assemblys compilés en tant que bibliothèques Windows fonctionneront toujours sous Silverlight en supposant qu'ils utilisent des API prises en charge. Vous pouvez modifier manuellement le projet Silverlight et ajouter une référence à l'assembly .NET normal. Notez que vous pouvez uniquement ajouter une référence à un assembly compilé et non au projet. L'application silverlight sera compilée et exécutée, mais dès qu'elle essaie d'utiliser une classe qui n'est pas présente dans Silverlight, vous obtenez une erreur d'exécution.

Pour démontrer la différence dans les API, consultez les captures d'écran suivantes. Comme vous pouvez le voir, les deux assemblages ont des API communes, mais celle de Silverlight en manque. Dès que votre assembly tente de toucher ces API, l'application devient BOOM!

complète .NET 4.0 mscorlib (espace de noms System.serialization):

Full .NET 4.0 mscorlib http://img188.imageshack.us/img188/2131/fullmscorlib.png

Silverlight 3 mscorlib (espace de noms System.serialization):

Silverlight 3 mscorlib http://img526.imageshack.us/img526/4254/sl3mscorlib.png

L'inconvénient de relier un ensemble de .NET complet est que vous ne sauriez pas avant l'exécution quelles API ne sont pas supportées. Compte tenu du fait que certaines API système prises en charge peuvent utiliser une API système non prise en charge, il n'existe pas de moyen facile de résoudre ce problème à l'avance.

Il y a des choses que vous pouvez faire pour faciliter le développement parallèle. L'approche recommandée par Microsoft est d'avoir un projet distinct pour .NET et Silverlight qui partagent le même code source. Vous pouvez le faire manuellement en ajoutant des fichiers en tant que liens vers le projet. C'est un peu un cauchemar de maintenance, mais au moins la plupart des erreurs seront capturées au moment de la compilation.

Alors maintenant, quand vous compilez quelque chose qui fait référence API manquant dans Silverlight vous obtenez une erreur:

public class SerializableExample: IEquatable<string>, System.Runtime.Serialization.ISerializable 
{ 
} 

error CS0234: The type or namespace name 'ISerializable' does not exist in the namespace 'System.Runtime.Serialization' (are you missing an assembly reference?)

Avec l'aide de la compilation conditionnelle (a-la bonne ol » C/C++ jours), vous pouvez désactiver des choses qui ne sont pas pris en charge:

public class SerializableExample: IEquatable<string> 
#if !SILVERLIGHT 
    , System.Runtime.Serialization.ISerializable 
#endif 
{ 
} 

Microsoft fournit également un outil de liaison de projet qui permet une maintenance automatique des projets qui ont des fichiers liés. Malheureusement, la version actuelle ne fonctionne pas sur VS2010, vous pouvez probablement compiler la source et y arriver, mais je n'ai pas essayé.

http://msdn.microsoft.com/en-us/library/dd458870.aspx

lien de téléchargement direct:

http://download.microsoft.com/download/6/3/8/6382E28D-2EBD-4A4E-BB76-6F425E1C9DB9/MicrosoftPracticesProjectLinkerFeb2009.msi

Cette Microsoft page décrit mult-ciblage dans les moindres détails.

Questions connexes