Использование CustomConverters, указанного в другой сборке, вызывает исключение - PullRequest
1 голос
/ 08 июня 2011

У меня есть две библиотеки классов, которые содержат некоторую часть презентации с использованием окон и пользовательских элементов управления. Допустим, это Presentation1 и Presentation2. У меня есть еще один CL, который является общим, и обе библиотеки презентаций ссылаются на него. В общей библиотеке я указал несколько пользовательских конвертеров. Я использую их в обеих презентациях, но в Presentation1 все работает нормально, но в Presentation2 те же конвертеры, которые видны во время разработки, но во время выполнения я получаю исключение:

'Предоставить значение для' System.Windows.StaticResourceExtension ', вызвавшего исключение.' Номер строки '55' и позиция строки '35'.

Если я перенесу любой из этих конвертеров в Presentation2 и укажу на них из себя, тогда они будут работать.

Любые предложения, пожалуйста, что может быть не так? Заранее спасибо.

Обновление:

Моя презентация2 xaml:

<UserControl x:Class="MyProject.PresentationCL2.Presentation.IssuedView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             xmlns:Converters="clr-namespace:MyProject.Common.Presentation.Converters;assembly=MyProject.Common">
    <UserControl.Resources>
        <ResourceDictionary>
            <Converters:IntToStringConverter x:Key="IntToStringConverter" />
        </ResourceDictionary>
    </UserControl.Resources>
    ...
     <ComboBox Margin="0, 10" 
               Grid.Row="1" Grid.Column="1"
               ItemsSource="{Binding Path=SomeCollection}"
               SelectedItem="{Binding Path=SomeCollectionSelectedValue, Converter={StaticResource IntToStringConverter}, Mode=TwoWay}"
                                  />
   ...
</UserControl>

Presentation1 xaml выглядит идентично, но работает нормально. Presentation2 создает исключение в той строке, на которую ссылается Converter из StaticResources.

Также стоит отметить, что когда я переместил этот IntToStringConverter в мою библиотеку Presentation2 (и он начинает работать должным образом, как в Presentation1), внутри его кода я использую несколько классов, на которые ссылается одна и та же Общая сборка, и он также работает.

Update2:

Я пытался обработать это исключение, используя DebugView, и результат представлен ниже:

[1] Сообщение об исключении: «Предоставить значение для« System.Windows.StaticResourceExtension », вызвавшее исключение.» Номер строки '48' и позиция строки '35'.
[2] Справка по исключению:
[3] Исключение Источник: PresentationFramework
[4] Исключение StackTrace: в System.Windows.Markup.XamlReader.RewrapException (Исключение e, IXamlLineInfo lineInfo, Uri baseUri)
[5] в System.Windows.Markup.WpfXamlLoader.Load (XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, логическое значение skipJournaledProperties, параметры объекта rootObject, параметры XamlObjectWriterSettings *, Uri baseUri 10) [6] at System.Windows.Markup.WpfXamlLoader.LoadBaml (XamlReader xamlReader, логический skipJournaledProperties, объект rootObject, XamlAccessLevel accessLevel, Uri baseUri)
[7] at System.Windows.Markup.XamlReader.LoadBaml (Потоковый поток, ParserContext parserContext, родительский объект, логическое значение closeStream)
[8] at System.Windows.Application.LoadComponent (компонент объекта, Uri resourceLocator)
[9] в SettingsView.InitializeComponent () в .. \ Presentation2 \ Presentation \ presentation \ SettingsView.xaml: строка 1
[10] в SettingsView..ctor (TobiiEyeTrackingSettingsViewModel viewModel) в .. \ Presentation \ SettingsView.xaml.cs: строка 14
[11] at Presentation2.MainClass.ShowSetupDialog (Object varHwndParent) в .. \ Presentation2 \ MainClass.cs: строка 171
[12] InnerExceptionMessage: метод или операция не реализованы.
[13] InnerExceptionStackTrace: в System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlType (BamlType bamlType, Int16 typeId)
[14] в System.Windows.Baml2006.Baml2006SchemaContext.GetXamlType (Int16 typeId)
[15] в System.Windows.Baml2006.Baml2006Reader.Process_ElementStart ()
[16] в System.Windows.Baml2006.Baml2006Reader.ReadObject (запись KeyRecord)
[17] в System.Windows.ResourceDictionary.CreateObject (ключ KeyRecord)
[18] at System.Windows.ResourceDictionary.RealizeDeferContent (ключ объекта, объект и значение, логическое значение и canCache)
[19] at System.Windows.ResourceDictionary.GetValueWithoutLock (Object key, Boolean & canCache)
[20] at System.Windows.ResourceDictionary.GetValue (Object key, Boolean & canCache)
[21] at System.Windows.ResourceDictionary.Lookup (ключ объекта, логический allowDeferredResourceReference, логический mustReturnDeferredResourceReference)
[22] at System.Windows.StaticResourceExtension.FindResourceInEnviroment (IServiceProvider serviceProvider, логическое allowDeferredReference, логическое mustReturnDeferredResourceReference)
[23] at System.Windows.StaticResourceExtension.TryProvideValueInternal (IServiceProvider serviceProvider, логическое allowDeferredReference, логическое mustReturnDeferredResourceReference)
[24] at System.Windows.StaticResourceExtension.ProvideValueInternal (IServiceProvider serviceProvider, логическое allowDeferredReference)
[25] в System.Windows.StaticResourceExtension.ProvideValue (IServiceProvider serviceProvider)
[26] at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue (MarkupExtension me, IServiceProvider serviceProvider)

Стоит добавить, что MainClass, упомянутый в строке 11, - это класс ComVisible, зарегистрированный в системе и реализовавший специальный интерфейс (скажем, ICOMInterface), где:

[Guid("... guid here ...")]
[ComVisible(true)]
public class MainClass : ICOMInterface
{
    ...

    public void ShowSetupDialog(object varHwndParent)
    {
        SettingsView view = new SettingsView();
        view.ShowDialog();
    }

    ...
} 

Если я не буду обрабатывать это исключение, то программа, вызывающая этот ShowSetupDialog через реализованный интерфейс, возвращает HRESULT 80131501, который является COR_E_SYSTEM, который является исключением SystemException в .Net

1 Ответ

0 голосов
/ 08 июня 2011

Вы должны иметь возможность углубиться в исключение и получить больше информации - попробуйте и опубликуйте все, что вы найдете.

В отсутствие этой информации я могу только предположить, что ваша библиотека Presentation2 не имеетссылка на вашу общую библиотеку.

...