Не удалось загрузить файл или сборку System.Componentmodel.Annotations 4.2.0.0 в конструкторе - PullRequest
5 голосов
/ 27 мая 2020

Я получаю эту ошибку, когда пытаюсь открыть форму в моей c#. NET библиотеке классов Framework 4.7.2. Проверено автоматическое создание перенаправления привязки

Стек вызовов:

at System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type)
at System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext)
at System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg)
at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent)
at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
at System.RuntimeType.GetCustomAttributes(Type attributeType, Boolean inherit)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectGetAttributes(Type type)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectedTypeData.GetAttributes()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetAttributes()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetAttributes()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetAttributes()
at System.ComponentModel.TypeDescriptor.GetAttributes(Type componentType)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectedTypeData.GetConverter(Object instance)
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetConverter()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetConverter()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetConverter()
at System.ComponentModel.TypeDescriptor.GetConverter(Type type)
at System.ComponentModel.PropertyDescriptor.get_Converter()
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetCollectionOfBoundDataGridViewColumns()
at System.Windows.Forms.DataGridView.RefreshColumns()
at System.Windows.Forms.DataGridView.RefreshColumnsAndRows()
at System.Windows.Forms.DataGridView.OnBindingContextChanged(EventArgs e)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
at System.Windows.Forms.Form.ControlCollection.Add(Control value)
at System.Windows.Forms.Design.ControlDesigner.DesignerControlCollection.Add(Control c) 

Я посмотрел этот вопрос и попытался добавить следующее в app.config файла .exe но это не помогло

  <dependentAssembly>
    <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="4.2.0.0" newVersion="4.7.0.0" />
  </dependentAssembly>

Фактическая форма находится в dll, поэтому я также попытался добавить ее в app.config dll

В моем файле проекта у меня есть

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>  
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>

Я вижу, что 4.2.0 даже недоступен на Nuget.

enter image description here

Интересно, могу ли я отключить попытку вызовите

DataGridView.DataGridViewDataConnection.GetCollectionOfBoundDataGridViewColumns()

во время разработки

Кажется безопасным просто нажать «Игнорировать и продолжить».

Изменения в Team Explorer указывают, что это не меняет код.

[Обновление]

Если я попытаюсь скопировать и вставить элемент управления DataGridView в другую форму, я получаю сообщение об ошибке при обработке этой команды. Не удалось загрузить файл или сборку an error occurred

Мне удалось добавить новый элемент управления DataGridView из панели инструментов, однако, когда я попытался прикрепить к нему источник привязки, я получил

Error setting value MyBindingSource to property DataSource

Error setting value

[Обновление]

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

Оказалось, что я забыл включить свойства проекта DataSources в исходный элемент управления.

Однако, когда я добавляю новый DataGridView и пытаюсь установить выбор источника привязки, я все равно получаю сообщение об ошибке: не удалось загрузить файл или сборку

Источник привязки основан на объекте. Ошибка возникает для определенного объекта, а не для другого. Возможно, это свойство объекта вызывает проблему.

[Обновление]

Проблема возникает, когда связанный объект содержит свойство, которое также является объектом

public class BOMObj
    {
       // public FramePart FramePart { get; set; } // error occurs if I uncomment this
        public string PartTypeName => $"{FramePart?.ComponentType}"; 
        public string thing3 => "thing 3";
        public string thing { get; set; }
        public  string thing2 { get; }

Я попытался создать экземпляр FramePart в конструкторе, но это не помогло

   public BOMObj() {
        FramePart = new FramePart();
    }

Я полагаю, имеет смысл, что этот код не может работать во время разработки ... но почему сообщение об отсутствии файла? 1066 * [Обновление] Из-за этого вопроса я вполне уверен, что с моими перенаправлениями все в порядке. Обратите внимание, что проблема возникает только во время разработки.

[Обновление]

Поиск в Process Monitor для System.ComponentModel.Annotations

ProcMon capture

Но не было сообщений об ошибках.

Я также попытался установить версию 4.1.0, что привело к предупреждению

NU1605  Detected package downgrade: System.ComponentModel.Annotations from 4.7.0 to 4.1.0. Reference the package directly from the project to select a different version. 

1 Ответ

0 голосов
/ 05 июня 2020

Попробуйте восстановить. Net Framework, запустите> запустить> appwiz.cpl и выберите опцию в. Net для восстановления.

Далее первое сообщение об ошибке: «Не удалось загрузить файл или сборка ". Где он ищет эту DLL? Запустите Process Monitor и проверьте путь, по которому Visual Studio ищет его. Либо поместите DLL / сборку туда, где она должна быть найдена, либо повторно сослаться на нее. Попробуйте откатиться до версии 4.1 и использовать эту версию NuGet или попробуйте более поздний пакет, например 4.4.1.

Install-Package System.ComponentModel.Annotations -Version 4.1.0

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...