2

私には独特の開発状況があり、他の人からの意見を求めています。

リッチ クライアント アプリケーション内に緩い xaml ファイルをロードする必要がある状況があります。特定の Loose xaml ファイルには、現在メモリに読み込まれていないアセンブリへの参照が含まれている可能性があるため、参照されているアセンブリは、loose xaml を読み込む前に読み込まれます。Loose xaml および結ばれたアセンブリは、クライアントにダウンロードされ、動的に読み込まれるさまざまなバックエンド サーバーに格納されます。

Loose xaml および/またはアセンブリはバージョン固有であり、残念ながら xaml のレンダリング間でアプリケーションをシャットダウンすることはできません。アセンブリ付きのv1 。サーバー A および xaml からのv1 。アセンブリ付きのv1 。サーバー B のv2。両方のアセンブリが同じ名前空間宣言を使用するため、「古い」アセンブリは、特定の緩い xaml の「新しい」アセンブリで引き続き機能します。

問題は、assembly.v2 の「新しい」機能への参照を含む xaml.v2 をロードすると、assembly.v2 への参照が得られないことです。

明らかに、アプリ ドメインから assembly.v1 をアンロードできません。また、マーシャリングによって別のアプリ ドメイン内に読み込まれた xaml のアイテムを参照できるかどうかもわかりません。

異なる名前空間参照を使用する以外のアイデアはありますか?

4

3 に答える 3

1

すでに動的アセンブリ解決と読み込みを行っていると思いますか? その場合は、Xaml で実際のアセンブリ名を偽のアセンブリ名に置き換えてみてください。アセンブリ解決コードでそれを使用して、正しいアセンブリを読み込んで返すことができます。たとえば、元のソース Xaml が次の場合:

xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly"

Xaml が MyAssembly の v2 を必要としていることがわかっている場合は、解析する前に Xaml 文字列のアセンブリ ref を次のように置き換えます。

xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly.v2"

..次に、アセンブリ解決/ロードコードで、最後に「.v2」ビットが表示されたら、代わりにそのアセンブリを探してロードします。

私が質問を誤解した場合、または現在カスタムアセンブリの解決を行っていない場合はお知らせください-それは確かにこの状況の鍵になると思います.

于 2009-02-06T16:21:57.787 に答える
1

別のオプション (アセンブリを適切にバージョン管理していると仮定) は、次のように ns 宣言にアセンブリ バージョンを単純に含めることです。

xmlns:ns0="clr-namespace:MyCompany.MyProject.MyNameSpace; Assembly=MyCompany.MyProject, Version=1.0.0.0"
于 2009-05-16T10:57:36.400 に答える
0

これが機能するかどうかは確認していませんが、可能性があると信じています。XmlnsDefinitionAttribute を (アセンブリ レベルで) 使用できます。例えば

アセンブリ V1 -> AssemblyInfo.cs

[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v1", "MyCompany.MyProject" )]

アセンブリ V2 -> AssemblyInfo.cs

[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v2", "MyCompany.MyProject" )]

そしてxamlで:

xmlns:myassembly="http://schema.mycompany.com/myproject/v2"
于 2009-05-16T09:01:59.627 に答える