2016-05-21 2 views
1

Я получаю исключение при отладке своей программы.Исключение System.MissingMethodException в mscorlib.dll

Исключение брошено: 'System.MissingMethodException' в mscorlib.dll System.Globalization.CultureInfo

"Конструктор по типу 'System.Globalization.CultureInfo' не найден."

в моем

xmlns:global="clr-namespace:System.Globalization;assembly=mscorlib" 
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework" 
> 
<Window.Resources> 
    <ObjectDataProvider x:Key="CulturesProvider" 
         ObjectType="{x:Type global:CultureInfo}" 
         MethodName="GetCultures"> 
     <ObjectDataProvider.MethodParameters> 
      <global:CultureTypes>AllCultures</global:CultureTypes> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

    <CollectionViewSource x:Key="MyCVS" 
          Source="{StaticResource CulturesProvider}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="IetfLanguageTag" /> 
     </CollectionViewSource.SortDescriptions> 
     <CollectionViewSource.GroupDescriptions> 
      <dat:PropertyGroupDescription PropertyName="Parent" /> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

Существуют ли какие-либо ссылки, которые мне нужно импортировать, чтобы сделать эту работу?

ответ

2

Код, который вы опубликовали, отлично работает, я попытался связать его с ListBox, и различные культуры были отображены правильно.

Хотя я заметил исключение, которое вы описали в окне «Вывод», поэтому я начал исследовать.

Here вы можете найти исходный код ObjectDataProvider. Я связался с той частью, которая нас действительно интересует.

Здесь вы можете увидеть, что код действительно попытается создать экземпляр ObjectType, который вы указали, даже если вы только пытаетесь вызвать статический метод для этого типа. Это приведет к сбою с указанным выше исключением, потому что CultureInfo не имеет конструктора, который принимает нулевые параметры.

Это даже упоминается в комментарии here:

// if InvokeMethod failed, we prefer to surface the instantiation error, if any. 
// (although this can be confusing if the user wanted to call a static method) 

Также я нашел this forum post где принял ответ на тот же вопрос заключается в следующем:

Если ваше приложение работает хорошо, вы можете игнорировать выход. Этот вывод используется для отладки ошибок привязки данных. Но, как правило, даже ваш код работает хорошо, вывод также может появиться, поэтому вы можете его игнорировать.

Поэтому я бы сказал, что вы можете проигнорировать эту ошибку, если ваше приложение работает, и когда я его протестировал, он должен работать.

Все, что сказал, если вы действительно раздражает, за исключением, вы можете это исправить, выполнив следующие действия:

xmlns:sys="clr-namespace:System;assembly=mscorlib" 
> 
<Window.Resources> 

    <ObjectDataProvider x:Key="CulturesProvider" ObjectType="{x:Type global:CultureInfo}" MethodName="GetCultures"> 
     <ObjectDataProvider.ConstructorParameters> 
      <x:Static Member="sys:String.Empty" /> 
     </ObjectDataProvider.ConstructorParameters> 
     <ObjectDataProvider.MethodParameters> 
      <global:CultureTypes>AllCultures</global:CultureTypes> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

Это не будет бросать исключение, потому что создание экземпляра CultureInfo в ObjectDataProvider код будет успешным. Он будет использовать конструктор, который принимает один параметр string.