2017-07-01 2 views
0

Ich habe zwei Probleme mit scheinbar verschiedenen Symptomen, die ich denke, kann das gleiche Problem sein. Beide Probleme treten auf einer Maschine auf, auf anderen nicht.Sondieren privatePath und Ressource Wörterbuch

In einem Fall wird eine .NET-Bibliothek in eine alte C++/MFC-Anwendung geladen. Diese Bibliothek öffnet ein WPF-Fenster, das die folgenden Fehler erzeugt:

Set property 'System.Windows.ResourceDictionary.Source' threw an exception. 
Cannot locate resource 'resourcedictionaries/images/bitmaps_32_32.xaml'. 

Der zweite Fehler tritt eine WPF-Anwendung zum Starten. Das Programm stürzt beim Laden und schreibt die folgenden Fehler in das Windows-Ereignisprotokoll:

Anwendung: Cs3SystemManager.exe 
Frameworkversion: v4.0.30319 
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet. 
Ausnahmeinformationen: System.IO.IOException 
    bei MS.Internal.AppModel.ResourcePart.GetStreamCore(System.IO.FileMode, System.IO.FileAccess) 
    bei System.IO.Packaging.PackagePart.GetStream(System.IO.FileMode, System.IO.FileAccess) 
    bei System.IO.Packaging.PackWebResponse+CachedResponse.GetResponseStream() 
    bei System.IO.Packaging.PackWebResponse.GetResponseStream() 
    bei System.IO.Packaging.PackWebResponse.get_ContentType() 
    bei MS.Internal.WpfWebRequestHelper.GetContentType(System.Net.WebResponse) 
    bei MS.Internal.WpfWebRequestHelper.GetResponseStream(System.Net.WebRequest, MS.Internal.ContentType ByRef) 
    bei System.Windows.ResourceDictionary.set_Source(System.Uri) 
    bei System.Windows.Baml2006.WpfSharedBamlSchemaContext+<>c.<Create_BamlProperty_ResourceDictionary_Source>b__342_0(System.Object, System.Object) 
    bei System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(System.Object, System.Object) 
    bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(System.Xaml.XamlMember, System.Object, System.Object) 
    bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(System.Object, System.Xaml.XamlMember, System.Object) 

Ausnahmeinformationen: System.Windows.Markup.XamlParseException 
    bei System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri) 
    bei System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri) 
    bei System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean) 
    bei System.Windows.Application.LoadComponent(System.Object, System.Uri) 
    bei Cs3SystemManager.App.InitializeComponent() 
    bei Cs3SystemManager.App.Main() 

Diese Anwendung auf die gleiche Ressource Wörterbuch bezieht, die in der ersten Fehlermeldung verwiesen wird. Mein starker Verdacht ist, dass es der gleiche Grundfehler ist.

Das Ressourcenverzeichnis wird mit der Syntax verwiesen:

<ResourceDictionary Source="/McWpfResources;component/ResourceDictionaries/Images/Bitmaps_32_32.xaml" /> 

Ich habe auch die folgende Syntax versucht, aber es hat keinen Unterschied machen.

<ResourceDictionary Source="pack://application:,,,/McWpfResources;component/ResourceDictionaries/Images/Bitmaps_32_32.xaml" /> 

Unsere Installation speichert ausführbare Dateien (.exe) in ein Verzeichnis ist und die DLL in ein Unterverzeichnis namens ist \ Interop (einige von ihnen sind Interop-Wrapper für COM-Komponenten) genannt.

Für jede EXE-Datei gibt es eine passende .exe.config Datei, die die privatePath, zum Beispiel speficies:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/> 
    </startup> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="interop"/> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

Wenn ich kopieren Sie die EXE-Dateien nach unten in den Interop-Verzeichnis, keines der Probleme tritt ein.

Offensichtlich funktioniert der privatePath-Parameter in diesem speziellen Fall nicht (zumindest nicht wie erwartet), aber es scheint auf anderen Computern und in anderen Anwendungen zu funktionieren.

Offensichtlich kann ich den Fehler beheben, indem ich alles in ein Verzeichnis lege, aber abgesehen davon, wie kann ich den Fehler beheben?

Antwort

0

Vergiss es. Das war mein Fehler.

Bei einer früheren Installation enthielt das Verzeichnis bin eine alte Version einer DLL, die jetzt im Unterverzeichnis interop installiert ist. Diese alte DLL wurde vor der DLL im Unterverzeichnis geladen.

Ich könnte diese Frage löschen (oder ich könnte es als eine warnende Geschichte lassen).