Сценарий
Производитель 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?