O.k, to jest naprawdę irytujące, wcześniej zauważyłem, że kod generowany przez WPF do ładowania zasobów XAML nie wydaje się używać silnych nazw i dlatego może być problematyczny w scenariuszach, w których trzeba wspierać równoległe wersje złożeń WPF.Jak zmusić WPF do używania identyfikatorów URI zasobów, które używają silnej nazwy zespołu? Argh!
Okazało się, że tak jest, i teraz powoduje to problemy - mam system wtyczek, który ma obsługiwać instalację wtyczek różniących się tylko numerem wersji (wersją) . To oczywiście może być wspierane przez .NET, ponieważ assemblie są określane, aby mieć różne tożsamości, nawet jeśli mają tę samą nazwę pliku DLL, pod warunkiem, że są silnie nazwane i mają inny publiczny/prywatny klucz LUB mają inny numer wersji zespołu.
Teraz, jeśli spojrzymy na kod wygenerowany dla okien i usercontrols przez visual studio, widzimy w pliku generowanego automatycznie następuje:
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/Sensormatic.AMK1000.Panel;component/views/servicepanelui.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Views\ServicePanelUI.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
Zawiadomienie linii, gdzie lokalizator zasobów jest tworzony - go używa względnego identyfikatora URI, który nie określa silnej nazwy lub wersji zestawu, który zawiera zasób xaml.
Pomyślałem, że może LoadComponent sprawdzi tożsamość zespołu wywołującego i użyje jego klucza publicznego i szczegółów wersji lub może sprawdzi tożsamość zespołu, który zawiera typ dla tego parametru.
Wygląda na to, że tak nie jest - jeśli masz dwa zespoły z różnymi numerami wersji (ale taką samą nazwę pliku), możesz uzyskać wyjątek IOException z komunikatem "Nie można zlokalizować zasobu X" (dla powyższego przykładu "Nie można zlokalizować zasobu "views/servicepanelui.xaml."
Co gorsza, jestem pewny, że oznacza to również, że złożenia o tej samej nazwie pliku, ale innym kluczu publicznym/prywatnym, tj. od różnych wydawców, również spowodują ten błąd
Więc, czy ktoś wie jak się z tym obejść? Jak sprawić, by nazwa WPF była zgodna z nazwą?
Uwaga, o ile mi wiadomo, jest to błąd WPF. Nie należy używać izolacji Appdomain, aby tego uniknąć.
Cześć Phil, mam do czynienia z tym samym problemem. czy byłeś w stanie znaleźć jakieś rozwiązanie tego problemu? –
Czy ktoś napotkał podobny problem z formantami niestandardowymi WPF używającymi motywów (za pomocą słowników zasobów)? Jeśli tak, jakieś rozwiązanie? – akjoshi
jakieś wieści na ten temat? –