2009-07-29 12 views
0

まず、SilverlightプロジェクトはWindowsクラスライブラリやAsp.net MVCプロジェクトのような非Silverlightベースのプロジェクトを参照できないことを知っています。しかし、私はSilverlightベースのプロジェクト& Asp.net MVCプロジェクトをサポートできるプロジェクトを作成する必要があります。VS.net 2008で.NET 3.5ベースのプロジェクトでSilverlight 3クラスライブラリを参照することは可能ですか?

私は共有ソースコード用にSilverlightベースのプロジェクトを作成しました。 VS.net 2008 & .Net 3.5 SP1で正常に動作します。しかし、.NETベースのプロジェクトからSilverlightベースのプロジェクトの一部のメソッドを次のコードのように使用しようとすると、何らかのエラーが発生しました。

Silverlightベースの方法

public static void InitializeInstance(object obj) 
{ 
    // Initialize Field Value 
    foreach (FieldInfo fi in obj.GetType().GetFields()) 
    { 
     foreach (Attribute attr in fi.GetCustomAttributes(true)) 
     { 
      if (attr is DefaultValueAttribute) 
      { 
       DefaultValueAttribute dv = (DefaultValueAttribute)attr; 
       fi.SetValue(obj, dv.Value); 
      } 
     } 
    } 

    // Initialize Property Value 
    foreach (PropertyInfo pi in obj.GetType().GetProperties()) 
    { 
     foreach (Attribute attr in pi.GetCustomAttributes(true)) 
     { 
      if (attr is DefaultValueAttribute) 
      { 
       DefaultValueAttribute dv = (DefaultValueAttribute)attr; 

       if (pi.CanWrite) 
       { 
        pi.SetValue(obj, dv.Value, null); 
       } 
      } 
     } 
    } 
} 

.NETベースの方法

private void Form1_Load(object sender, EventArgs e) 
{ 
    InitializeInstance(this); 
} 

エラー詳細

System.IO.FileNotFoundException : ファイルまたはアセンブリをロードできませんでした。 'System、Version = 2.0.5.0、 Culture =ニュートラル、 PublicKeyToken = 7cec85d7bea7798e'または 依存関係の1つ。システム は、指定されたファイルを見つけることができません。 ファイル名: 'システム、バージョン= 2.0.5.0、 文化=中立、 なPublicKeyToken = 7cec85d7bea7798e' でInitializeInstance(オブジェクトobj)最後に

、私はのSystem.dllのをコピーすることによってこの問題を解決しようとしますディレクトリを出力して参照するためのSilverlight。それでも同じエラーが表示されます。だから、私はこのエラーが両方の制限かもしれないと思います。& Silverlightプラットフォーム。この問題を避けるための考えはありますか?

PS。私はいくつかの共有コードのためにthis techniqueを使用できることを知っています。しかし、これは私のプロジェクトでは不可能です。それは非常に複雑なので&非常に複雑なSilverlightベースまたは.NETベースのクラスライブラリを直接作成する以上。デスクトップCLR上でのSilverlight、PresentationFrameworkまたはPresentationCoreでSystem.Windows:

おかげで、

+0

この問題を解決するために、System.dllに含まれるすべてのクラスを削除します。それは正常に動作します。しかし、私は理解していません。なぜSystem.Core.dllに含まれるクラスによってSystem.dllのようなエラーが発生しないのですか? –

+0

ファイルリンクを使用することをお勧めします。あなたには適していないファイルリンク方法を使用して、特定の種類のコードまたは複合オブジェクトを含めることを試みていますか? –

答えて

1

ここでのトラブルは、これらの型が異なる厳密名を持つアセンブリを共有することです。

実行時に、目的のタイプをロードすることはできません。また、Silverlightからデスクトップへのタイプにはタイプ転送がありません。

私の推奨される解決策 ファイルへのリンクを使用することを検討して、代わりに、実際には同じ構築されたバイナリを参照しようとしているの。

MyApp\ 
    Silverlight\ 
    Page.xaml 
    Page.xaml.cs 
    (link) ..\AspMvc\MySharedDataFile.cs 
    AspMvc\ 
    MySharedDataFile.cs 
    MyApp.cs 

この方法で、ソースは両方のプロジェクトで再コンパイルされます:

この方法で、あなたはこのように見えるかもしれプロジェクトのソース構造を持つことができます。これをSilverlight Toolkitで使用して、WPFとSilverlightの両方のチャートやデータの視覚化コントロールを含む多くのコントロールを構築します。これは、両方のバイナリを参照するのではなく、プラットフォームごとに再構築することです。

Visual Studioにリンクを挿入するには、プロジェクトまたはそのフォルダの1つを右クリックし、既存のアイテムを追加して、エクスプローラのファイルを開くダイアログで探します。ただし、ボタンをクリックするだけでなく、[ファイルの追加]ボタンの小さな下向き矢印をクリックし、[リンクとして追加]オプションを選択します。

次に、別の場所からそのファイルを作成するだけですが、コピーではないため、1か所に保持して、両方で使用できます。

あなたは、実際に新しいアプリケーションドメインを作成するために、非常に高い信頼のあるデスクトップアプリから.NETリフレクションを使用してアセンブリの解決イベントにフックアップ、そしてそれが何を見ることができますクレイジーソリューション 。代わりにデスクトップのCLRから型を返すか、これらの警告を表示しないでください。

正常に機能しているかどうかわかりません。

+0

私は知っています。ソースコードを作成するためにファイルをリンクすることができます。どのようにSilverlightフレームワークではない.NETフレームワークのシステムアセンブリで型とメソッドを使用するのですか? –

関連する問題