スティアン、
早速のお返事ありがとうございます。ミゲル・カストロのスクリーンキャストを見ましたが、とても参考になりました。残念ながら、Silverlightの状況はカバーされていません。しかし、それを出発点として使用することで、他の人が役立つと思われる何かを機能させることができました。
ServerDataContractsとSilverlightDataContractsの2つのアセンブリを作成します(これはSilverlightアセンブリとして)。それぞれのAssemblyInfo.csに、次の行を追加します。
[assembly: ContractNamespace("http://YourNamespaceUri",
ClrNamespace = "YourDataContractsNamespace")]
すべてのDataContractsをServerDataContractsアセンブリに追加します。SilverlightDataContractsアセンブリで、プロジェクト(またはサブフォルダー)を右クリックし、[既存のアイテムの追加]を選択します。ServerDataContractsアセンブリのDataContractsを参照し、追加するものを選択します。「追加」を押さないでください!!! 代わりに、[追加]の横にある下向き矢印をクリックして、[リンクとして追加]を選択します。これにより、SilverlightDataContractsプロジェクトがServerDataContractsプロジェクトの既存のファイルにリンクされます。これで、1つを編集すると、両方のプロジェクトに変更が加えられます。コンパイルすると、プロジェクトは正しいターゲットで個別にコンパイルされます。
次に、ServerDataContractsアセンブリをサービスコントラクトプロジェクトへの参照として追加します。SilverlightアプリケーションへのSilverlightDataContractsアセンブリについても同じようにします。Silverlightクライアントからサービスにサービス参照を追加する場合、データコントラクトは生成されません。代わりに、アセンブリからのものを使用する必要があります。
私はこれを機能させましたが、生成されたデータコントラクトクラスによって提供される機能の一部がまだ不足しています。生成されたクラスはINotifyPropertyChangedを実装します。これは、silverlight/wpfでのデータバインディング時に非常に役立ちます。これを自分で実装することはできますが、かなり面倒であり、サーバーでPropertyChangedイベントをサブスクライブすることはおそらくない場合でも、サーバーコードはすべてのプロパティセットでこれらのイベントハンドラーをすべて実行する必要があります。
私はまだこれを処理するためのよりクリーンな方法を探しています。Silverlight 4を使用すると、クライアントとサーバーの両方で同じアセンブリを使用できるという点で、これが簡単になるようです(コンパイルされたコードは互換性があります)。残念ながら、それは私のニーズには遠すぎます。