Ссылка на сборку со строгим именем в файлах resouce resx

Сценарий

Производитель GreatLib.dll развертывает настраиваемый элемент управления. Он все больше используется в клиентском приложении Winforms. GreatLib имеет строгое имя и предоставляет несколько типов. Когда эти типы используются как общедоступные свойства в формах клиентов, они также доступны в конструкторе Windows Forms. Вот где начинаются проблемы:

Дизайнер создаст элементы для всех этих типов в файле ресурсов формы и сериализует их значения по умолчанию (?) В этих элементах. Поскольку GreatLib имеет строгое имя, ссылка будет включать полное имя сборки. (Я думаю, это то, что делает Resgen?). Такие предметы могут выглядеть следующим образом:

<data name="vector3Control1.value" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
    AAEAAAD/////AQAAAAAAAAAMAgAAAFRJTE51bWVyaWNzLCBWZXJzaW9uPTQuMi41MzM4LjQ4MDIxLCBD
    dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPThkOWJmNTBlZjg1NDczNGQFAQAAABpJTE51bWVy
    aWNzLkRyYXdpbmcuVmVjdG9yMwMAAAADbV94A21feQNtX3oAAAALCwsCAAAAAAAAAAAAAAAAAAAACw==
</value>
</data>

В файле Form.Designer.cs дизайнер генерирует код, похожий на этот, для чтения элементов ресурсов:

this.vector3Control1.value = ((ILNumerics.Drawing.Vector3)(resources.GetObject("vector3Control1.value")));

Проблема

Производитель предоставляет обновление для GreatLib, заказчик заменяет старую версию на новую. Но файл ресурсов останется прежним! Следовательно, мы либо получаем InvalidCastExeption в коде Designer.cs, либо - если старая сборка больше не была найдена - FileNotFoundException.

Каков рекомендуемый способ обработки строгих имен в файлах resx?

Полностью предотвратить их с помощью

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

? Или вручную преобразовать данные base64 при каждом обновлении как , предложенный HansPassant?


person Haymo Kutschbach    schedule 13.08.2014    source источник
comment
Просто передайте эту строку в Convert.FromBase64String (). И вы обнаружите, что это будет работать, только если у вас есть версия 4.2.5338.48021 класса ILNumerics.Drawing.Vector3, на который ссылается ваш проект. Вероятность того, что вы это сделаете, составляет примерно 1 из 48021. Ноль, когда вы задаете этот вопрос.   -  person Hans Passant    schedule 14.08.2014
comment
Чтобы вы посоветовали? Предотвращение использования строгих имен, использования конструктора, создания библиотек элементов управления или их обновления?   -  person user492238    schedule 14.08.2014
comment
@Hans Passant Как ни странно, это должно коснуться практически каждого поставщика управляющих библиотек. И у них есть несколько длинных статей в базе знаний по этой проблеме - но реального решения нет. Некоторые предоставляют свои собственные инструменты обновления, которые, вероятно, делают то, что вы предложили.   -  person Haymo Kutschbach    schedule 14.08.2014
comment
Авторитетные поставщики средств управления не делают этого, они очень тщательно управляют своими номерами версий и никогда не рассматривают возможность их автоматического создания.   -  person Hans Passant    schedule 14.08.2014
comment
Извините, @HansPassant, я не могу подписаться. Как это связано с вопросом? Достойный или нет - есть ли ответ, как поступать со строго именованными ссылками на сборки, встроенными в файлы ресурсов при обновлениях?   -  person Haymo Kutschbach    schedule 15.08.2014
comment
@HansPassant смешно, я только что наткнулся на этот пост stackoverflow.com/a/3769491/1215993 - звучит как-то вопреки вашему утверждению здесь ? Неважно ... :)   -  person Haymo Kutschbach    schedule 30.10.2014